8.2.1.8 Оптимизация внешних объединений
Внешние объединения включают LEFT JOIN и RIGHT JOIN.
MySQL реализует оптимизацию внешних объединений следующим образом:
Таблица
Bустанавливается как зависящая от таблицыAи всех таблиц, от которых зависитA.Таблица
Aустанавливается как зависящая от всех таблиц (кромеB), используемых в условииLEFT JOIN.Условие
LEFT JOINиспользуется для определения того, как извлекать строки из таблицыB. (Другими словами, любые условия в предложенииWHEREне используются.)Выполняются все стандартные оптимизации объединений, за исключением того, что таблица всегда считывается после всех таблиц, от которых она зависит. При наличии циклической зависимости возникает ошибка.
Выполняются все стандартные оптимизации
WHERE.Если в таблице
Aесть строка, соответствующая условиюWHERE, но в таблицеBнет строки, соответствующей условиюON, генерируется дополнительная строкаBсо всеми столбцами, установленными вNULL.Если вы используете
LEFT JOINдля поиска строк, которые не существуют в какой-то таблице, и у вас есть следующее условие:в частиcol_nameIS NULLWHERE, гдеcol_name- столбец, объявленный какNOT NULL, MySQL прекращает поиск дополнительных строк (для определённой комбинации ключей) после того, как найдена одна строка, соответствующая условиюLEFT JOIN.
Реализация RIGHT JOIN аналогична реализации LEFT JOIN с обратными ролями таблиц. Правые объединения преобразуются в эквивалентные левые объединения, как описано в разделе 8.2.1.9, «Оптимизация внешних объединений».
Для 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;
Теперь оптимизатор может использовать таблицу t2 до таблицы t1, если это приведёт к более эффективному плану запроса. Для указания порядка объединения таблиц используйте STRAIGHT_JOIN; см. раздел 13.2.9, «Выражение SELECT». Однако STRAIGHT_JOIN может препятствовать использованию индексов, так как отключает преобразования полуобъединений; см. раздел 8.2.2.1, «Оптимизация подзапросов, производных таблиц и ссылок на представления с преобразованиями полуобъединений».
© 2025 Oracle
Licensed under the GPLv2 License.