2011-01-22 1 views
1

Я сомневаюсь в производительности «двумя или более отдельными командами SQL» или «1, но используя команду« join »SQL».Быстрее ли использовать два отдельных оператора SQL или один оператор SQL с JOIN?

Вот вещь:

К примеру, у меня есть две таблицы: post, user

post имеет user_id, указывающий это сообщение выдается некоторым другим пользователем в user

и я собираемся извлечь как сообщение, так и имя пользователя.

Я могу либо

 
SELECT * FROM `post` LEFT JOIN `user` on post.user_id = user.id WHERE 1 

или

 
$rows = $db->sql("SELEFT * FROM `post` WHERE 1") 
for $row in $rows: 
    $db->sql("SELECT * FROM `user` WHERE id = $row['user_id']") 

мне интересно, какой из них будет иметь более высокую производительность?

А что, если у меня есть 3 или более таблицы, чтобы присоединиться, какой путь будет лучше (с точки зрения производительности)?

+0

Существует (как правило, небольшой, но не нулевой) штраф за выполнение при использовании LEFT JOIN (или RIGHT JOIN или FULL JOIN) по сравнению с INNER JOIN. Если вы можете, избегайте ЛЕВЫЙ ПРИСОЕДИНЕНИЕ и используйте только JOIN. У вас есть сообщение, для которого нет записи пользователя? Если нет (и вы не должны), то подходящим является INNER JOIN. –

ответ

5

Присоединение почти всегда будет лучше. Даже если данные, которые он получает, являются «большими», вы по-прежнему выполняете только один запрос.

Это как покупка бакалейных товаров. Легче ездить в магазин ОДИН РАЗ, пополнить корзину и прийти домой со множеством разных предметов, по сравнению с магазином, покупая одно, возвращаясь домой, снова отправляясь в магазин, покупая другое.

Каждая из этих поездок складывается, и вы в конечном итоге тратите больше времени на вождение, чем наслаждение своей продукцией.

+0

Спасибо! Я думаю, что это отличный пример, и я понимаю это сейчас. –

3

Настоятельно рекомендуется использовать LEFT JOIN, потому что в противном случае запрос внутри цикла (как во втором примере) будет кратным ударом по вашей базе данных, что также является опасной ситуацией.

3

Обратите внимание, что вы не выполняете 2 запроса. Вы выполняете первый запрос один раз и второй запрос N раз, где N - количество строк, возвращаемых первым запросом. Это будет намного дороже, чем позволить оптимизатору запросов иметь дело с одним запросом соединения.

Оптимизаторы базы данных тщательно написаны экспертами для минимизации затрат на операции. Если вы попытаетесь угадать оптимизатор, запустив отдельные запросы, вы должны проиграть, плохо, каждый раз - если оптимизатор не сильно его взорвал. В остальном, кроме того, СУБД должен составлять вариации второго оператора каждый раз, когда он вызывается, а не только один раз. Оптимизатор должен быть настолько дьявольски ошибочным, что этого просто не произойдет.

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