2010-01-27 3 views
0

Я работаю с PDO подключением для mysql, и я хотел бы получить некоторое мнение по запросу, который я использую, чтобы проверить, есть ли в базе данных tags и добавить его в случае нет.PDO: проверить наличие тегов в db, а затем вставить

// the tags are allready processed in $tags array 

$check_stmt = $connection->prepare ("SELECT * FROM tags WHERE tag_name = :tag_name"); 
$save_stmt = $connection->prepare ("INSERT INTO tags (tag_name) VALUES (:tag_name)"); 

foreach ($tags as $current_tag) { 
    $check_stmt->bindParam (':tag_name', $current_tag, PDO::PARAM_STR, 32); 
    $save_stmt->bindParam (':tag_name', $current_tag, PDO::PARAM_STR, 32); 
    $check_stmt->execute ($current_tag); 
    if ($check_stmt->rowCount() == 0) $save_stmt->execute ($current_tag); 
} 

Я не опытный с базами данных, так что я не уверен, что если запрос хорошо проецируется

+0

Возможный дубликат [Какая конструкция БД выполняется быстрее: уникальный индекс и INSERT IGNORE или с помощью SELECT для поиска существующих записей?] (Http://stackoverflow.com/questions/1328074/which-db-design-is- быстрее-а-уникальный индекс-и-вставки игнорируемые или использующих-выбрать-к) – outis

ответ

1

Я бы настроить ваш запрос выбора немного, чтобы оптимизировать:

SELECT 1 AS found FROM tags WHERE tag_name = :tag_name LIMIT 1 

SELECTING * передает гораздо больше данных (все поля в соответствующих записях) из db в ваше приложение, чем это необходимо. выбор только тех полей, которые вам нужны, намного эффективнее, и в этом случае похоже, что вы просто проверяете существование, поэтому вам не нужны любые данные для записи, поэтому SELECT 1.

LIMIT 1 ограничивает результаты запроса одной записью, а не всего подходящих. Более быстрое выполнение запроса и еще меньше передачи данных.

0

Некоторые более грязные параметры, специфичные для MySQL, включают просто использование REPLACE INTO (не требуется) или ключевое слово IGNORE в сочетании с INSERT (рекомендуется). Синтаксис INSERT IGNORE будет немного быстрее, чем выполнение вашего SELECT отдельно.

Смежные вопросы