Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Последовательность left и inner join в запросе


Автор: maxipub 25.6.2018, 16:07
Здравствуйте.

Правильно ли я понимаю, что данные два запроса будут равнозначными:

Код

SELECT * FROM t1 
INNER JOIN t2 ON cond
INNER JOIN t3 ON cond
INNER JOIN t4 ON cond
LEFT JOIN t5 ON cond


Код

SELECT * FROM t1 
LEFT JOIN t5 ON cond
INNER JOIN t2 ON cond
INNER JOIN t3 ON cond
INNER JOIN t4 ON cond


?

Автор: Akina 25.6.2018, 17:37
И да, и нет. Результат будет одинаковый, а планы выполнения (и соответственно время и использованные ресурсы) - разные.

Автор: maxipub 25.6.2018, 17:42
Akina, насколько я знаю:

1) джойны обрабатываются в той же последовательности, в которой указываются в запросе;
2) сначала рекомендуют ставить легкие таблицы, тяжелые - в конец.

Это верно?

А собственно сам вопрос, состоял как раз в результате. Т.е. LEFT и INNER JOIN-ы можно как угодно менять местами (ну понятно, что t5 не ставить на место t1 в примере, это уже банально будет не LEFT), на результат это ни как не повлияет?

Автор: eclipsle88 19.7.2018, 22:28
Не, результат может и не совпасть, т.к. там левое соединение - заполняет сначала левую, потом правую и нулями дополняет. А если в самом начале сделать лефт, то оно и потянет все эти нули вниз за собой, надеюсь понел

Автор: Akina 20.7.2018, 10:07
Цитата(maxipub @  25.6.2018,  18:42 Найти цитируемый пост)
джойны обрабатываются в той же последовательности, в которой указываются в запросе;

Не "джойны обрабатываются", а "таблицы сканируются". И только при условии наличия хотя бы одного стороннего (LEFT/RIGHT) связывания - если все связывания внутренние (INNER), оптимизатор сам решает, в каком порядке сканировать таблицы (однако можно дополнительной инструкцией STRAIGHT_JOIN запретить ему эту самодеятельность).

Цитата(maxipub @  25.6.2018,  18:42 Найти цитируемый пост)
сначала рекомендуют ставить легкие таблицы, тяжелые - в конец

Нет. В начало следует помещать наиболее селективные таблицы. Т.е. те, для которых условие связывания и/или отбора оставляет минимальное количество промежуточных наборов данных. И далеко не всегда это самые маленькие таблицы.

Цитата(eclipsle88 @  19.7.2018,  23:28 Найти цитируемый пост)
результат может и не совпасть, т.к. там левое соединение - заполняет сначала левую, потом правую и нулями дополняет. А если в самом начале сделать лефт, то оно и потянет все эти нули вниз за собой

Бред сивой кобылы. Это "добавление нулей" (на самом деле NULL) определяется ТОЛЬКО условиями связывания и никак не зависит от порядка.
Не веришь? Попробуй создать пример, когда изменение порядка таблиц без изменения условий связывания изменит результат выборки... когда надоест - скажешь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)