Каковы различия между этими типами запросов JOIN и есть ли какие-либо предостережения?

У меня есть несколько запросов (из другого раздела моего сайта), которые я выполняю

Некоторые такие:

SELECT field, field1 
FROM table1, table2 
WHERE table1.id = table2.id 
AND ....

а некоторые такие:

SELECT field, field1 
FROM table1 
JOIN table2 
USING (id)  
WHERE ...
AND ....

а некоторые такие:

SELECT field, field1 
FROM table1 
LEFT JOIN table2 
 ON (table1.id = table2.id)
WHERE ...
AND ....

Какой из этих запросов лучше, или медленнее / быстрее или более стандартным?

3 ответа

Решение

Первые два запроса эквивалентны; в мире MySql ключевое слово using (ну, почти - см. документацию, но использование является частью спецификации Sql2003, и есть некоторые различия в значениях NULL) так же, как и высказывание field1.id = field2.id

Вы можете легко написать их как:

SELECT field1, field2
FROM table1
INNER JOIN table2 ON (table1.id = table2.id)

Третий запрос - это левое соединение. Это выберет все совпадающие строки в обеих таблицах, а также вернет все строки в table1, которые не имеют совпадений в table2. Для этих строк столбцы в table2 будут представлены значениями NULL.

Мне нравится визуальное объяснение Джеффа Этвуда этих

Теперь о том, что лучше или хуже. Ответ, это зависит. Они для разных вещей. Если в table1 больше строк, чем table2, то левое соединение вернет больше строк, чем внутреннее соединение. Но на производительность запросов будут влиять многие факторы, такие как размер таблицы, типы столбцов, то, что одновременно делает база данных.

Ваша первая задача должна заключаться в том, чтобы использовать запрос, необходимый для получения данных. Вы можете честно узнать, какие строки в таблице1 не имеют совпадений в таблице2; в этом случае вы бы использовали левое соединение. Или вы можете захотеть только строки, которые соответствуют - ВНУТРЕННЕЕ СОЕДИНЕНИЕ.

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

Третий пример, используя ON (field1=field2) является более распространенным, и, кажется, является более общепринятым стандартом.

Я не знаю о разнице в производительности, вам придется запустить некоторые EXPLAIN запросы, чтобы увидеть, что на самом деле MySQL в конечном итоге делает со всеми ними.

Я знаю, хотя, что первый, с WHERE будучи использованным, чтобы объединить их все, намного менее читабелен на чем-нибудь кроме тривиальных запросов. Если в запросе есть какие-то сложные условия, перепутать, что "условия соединения" смешаны с "условиями выбора".

Лично я предпочитаю использовать левые соединения в моих запросах, хотя вы можете столкнуться с проблемами в случае нулевых записей или дубликатов, но это может быть решено с помощью простой модификации с внешним предложением. Насколько я понимаю, объединение является более ресурсоемким, но это спорный вопрос и может основываться на личных предпочтениях.

только мои $.02.

Другие вопросы по тегам