Я пытаюсь сравнить два запроса:
Запрос 1:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a
WHERE tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d AND tableA.e=tableB.e
Запрос 2:
SELECT a,b,c,d,e
FROM tableA
LEFT JOIN tableB
ON tableA.a=tableB.a AND tableA.b=tableB.b AND tableA.c=tableB.c AND tableA.d=tableB.d
WHERE tableA.e=tableB.e
Прав ли я сказать, что эти два запроса дают одинаковые результаты?
Кроме того, правильно ли сказать, что первый запрос создает большую таблицу, для которой необходимо выполнить большее WHERE
условие; тогда как во втором случае мы имеем меньшую построенную таблицу, к которой WHERE
затем применяется простое .
Предполагая, что результаты совпадают, какой запрос должен быть предпочтительным? Есть ли очевидная проблема с производительностью?
mysql
performance
Geoff
источник
источник
INNER JOIN
, но сLEFT JOIN
этим будет возвращать другие результаты. В основном, условия, которые вы добавили вWHERE
свой второй запрос, конвертируют васJOIN
вINNER JOIN
INNER JOIN
мои вопросы о производительности остались в силе?ON
и критерии фильтрации вWHERE
.Ответы:
Если мы считаем, что вы используете
INNER JOIN
вместоLEFT JOIN
(что, по-видимому, ваше намерение), эти два запроса функционально эквивалентны. Оптимизаторы запросов рассмотрят и оценят критерии в вашемWHERE
предложении и вашемFROM
предложении и учтут все эти факторы при построении планов запросов для достижения наиболее эффективного плана выполнения. Если мы выполнимEXPLAIN
оба оператора, мы получим одинаковый результат:Запрос 1 :
[Результаты] :
Запрос 2 :
[Результаты] :
Вы можете просмотреть полную информацию по следующим ссылкам. Я также создал пример SQL 2008, чтобы вы могли сравнить, как работают два движка (что одинаково):
Пример запроса MySQL
Пример запроса SQL 2008 (убедитесь, что вы «Просмотреть план выполнения» для обоих результатов)
источник
INNER JOIN
вместо,LEFT JOIN
и я получаю тот же результат в десятой части времени. Я думаю, я знаю, почему я получаю такой же результат, но почему быINNER JOIN
иметь лучшую производительность?LEFT JOIN
и внешнее соединение, оно не может ограничить набор данных на стороне полного возврата набора и попытается извлечь все строки из этой таблицы (в данном случае, TableA). Если вы используетеINNER JOIN
, он может использовать эти критерии в обеих таблицах и ограничить набор данных, тем самым обеспечивая более быстрый возврат.