Spec-Zone .ru
спецификации, руководства, описания, API

8.13.7. LEFT JOIN и RIGHT JOINОптимизация

MySQL реализует A LEFT JOIN B join_condition следующим образом:

Реализация RIGHT JOIN походит на тот из LEFT JOIN с ролями инвертированных таблиц.

Оптимизатор соединения вычисляет порядок, в котором нужно присоединиться к таблицам. Табличный порядок чтения, вызванный LEFT JOIN или STRAIGHT_JOIN помогает оптимизатору соединения сделать свою работу намного более быстро, потому что есть меньше табличных перестановок, чтобы проверить. Отметьте, что это означает, что, если Вы делаете запрос следующего типа, MySQL делает полное сканирование на b потому что LEFT JOIN силы это, чтобы быть считанным прежде d:

SELECT *  FROM a JOIN b LEFT JOIN c ON (c.key=a.key)  LEFT JOIN d ON (d.key=a.key)  WHERE b.key=d.key;

Фиксация в этом случае является обратной порядок в который a и b перечисляются в FROM пункт:

SELECT *  FROM b JOIN a LEFT JOIN c ON (c.key=a.key)  LEFT JOIN d ON (d.key=a.key)  WHERE b.key=d.key;

Для a LEFT JOIN, если WHERE условие всегда является ложью для сгенерированного NULL строка, LEFT JOIN изменяется на нормальное соединение. Например, WHERE пункт был бы ложью в следующем запросе если t2.column1 были NULL:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

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

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

Это может быть сделано быстрее, потому что MySQL может использовать таблицу t2 перед таблицей t1 если выполнение так привело бы к лучшему плану запроса. Чтобы обеспечить подсказку о табличном порядке соединения, использовать STRAIGHT_JOIN. (См. Раздел 13.2.9,"SELECT Синтаксис".)