LEFT JOIN
может , но не всегда, заставляет сначала смотреть на «левый» стол.
JOINs
(но не LEFT JOINs
) плюс WHERE
что касается одной таблицы, дает Оптимизатору надежный и надежный совет сначала взглянуть на эту таблицу.
JOIN
, а также WHERE
, касающийся нескольких столов - оптимизатор иногдавыбирает правильную «первую» таблицу, иногда нет.
Оптимизатор обычно получает строки из одной таблицы (в зависимости от того, какая из них выбрана как лучшая для начала), затем выполняет NLJ (Соединение с вложенным циклом).Это означает попадание в следующую таблицу по одной строке за раз.Для этого «охвата» нужен хороший индекс.
IN ( SELECT ... )
, в старых версиях было ужасно неоптимально.Теперь он может превратиться в «полусоединение», например EXIST ( SELECT ... )
, и быть весьма эффективным.Иногда делать это вручную полезно.
"Взрывать-взрывать" поражает множество людей.Это где JOIN
и GROUP BY
.Группировка в основном состоит в том, чтобы вытеснить большое количество строк, созданных соединением.Иногда «производная» таблица может быть отличной оптимизацией.(Это ручная переформулировка запроса.)
Часто LEFT JOIN
, который используется для агрегата, можно сложить примерно так: SELECT ..., ( SELECT SUM(foo) FROM ... ) AS foos, ...
, тем самым уменьшая взрыва-взрыва.
Понимание преимуществ «составных» индексов, пожалуй, самая распространенная проблема на этом форуме.
Должен ли я идти дальше?Я сомневаюсь, что я охватил более 1/4 случаев.Итак, я согласен с @ leftjoin.
Вот несколько простых советов: http://mysql.rjweb.org/doc.php/index_cookbook_mysql