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

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

Некоторые из них выглядят так:

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 ]

19 голосов
/ 08 декабря 2011

Первые два запроса эквивалентны;в мире 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 , чтобы сообщить вам, как база данных будет выполнять каждый вид запроса.Это очень полезно, когда вы пытаетесь выяснить, почему запрос выполняется медленно, поскольку вы можете видеть, где база данных тратит все свое время.

0 голосов
/ 08 декабря 2011

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

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

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

0 голосов
/ 08 декабря 2011

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

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

...