Spec-Zone .ru
спецификации, руководства, описания, API
|
MySQL реализует
следующим образом:A
LEFT JOIN B
join_condition
Таблица B
устанавливается зависеть от
таблицы A
и то все, таблицы, на который A
зависит.
Таблица A
устанавливается зависеть от
всех таблиц (кроме B
) это используется в LEFT JOIN
условие.
LEFT JOIN
условие используется, чтобы решить, как
получить строки от таблицы B
. (Другими словами, любое условие
в WHERE
пункт не используется.)
Вся стандартная оптимизация соединения выполняется, за исключением того, что таблица всегда читается после всех таблиц, от которых она зависит. Если есть круговая зависимость, MySQL выпускает ошибку.
Весь стандарт WHERE
оптимизация выполняется.
Если есть строка в A
это соответствует
WHERE
пункт, но нет никакой строки в B
это соответствует ON
условие, дополнительное B
строка сгенерирована со всем набором столбцов к NULL
.
Если Вы используете LEFT JOIN
чтобы найти строки,
которые не существуют в некоторой таблице и у Вас есть следующий тест:
в col_name
IS NULLWHERE
часть, где col_name
столбец, который объявляется как NOT NULL
, MySQL прекращает искать больше
строк (для определенного сочетания клавиш) после того, как он нашел одну строку, которая соответствует
LEFT JOIN
условие.
Реализация 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
Синтаксис".)