@synapse_people

Как ведет себя JOIN & WHERE?

Здравствуйте
Допустим есть запрос условно:
select ... from t0
inner join t1 on t1.col1=t1.col0
inner join t2 on t2.col2=t1.col1
inner join tN on tN.col2=t2.col1
//ну вы поняли, каскадно джойнится таблица А ДАЛЕЕ ИДЕТ
WHERE t2.colN IS TRUE

Теперь вопрос,
сервер сначала сджойнит все данные всех таблиц t0 t1 t2 t...N ИЛИ он дойдет до джойна t2 и увидит строгое WHERE, которое связано с этой таблицей и выгребет только те строки, которые соответствуют и ON И WHERE?

То есть вопрос, сначала обрабатываются все JOIN-ON, а затем WHERE
или учитывается WHERE еще на этапе JOIN?
MYSQL последний, но интересно как на других базах тоже. Спасибо
  • Вопрос задан
  • 8432 просмотра
Пригласить эксперта
Ответы на вопрос 4
ayazer
@ayazer
Sr. Software Engineer
Он выгребет только то что надо. А еще может поменять порядок джойнов чтоб выгребать меньше/быстрее. Но в целом план выполенения запроса будет зависеть от многих факторов (в т.ч. кол-во данных в таблицах, индексы и статистика по этим индексам), потому всегда лучше посмотреть експлейн. А вот нюансы уже могут отличатся от вендора к вендору
Ответ написан
Общая логика: сначала всё сджойнить, потом от фильтровать по where.
Можно указать условия из where в нужном join, тогда отбор значений будет до join.
Как-то так: on (t1.id=t2.id and <условие>)
Ответ написан
Комментировать
@101-s
хороший вопрос, заставил меня прочесть статью: https://bookflow.ru/10-prostyh-shagov-k-polnomu-po...
есть лексический порядок и есть логический
Мы пишем так:
SELECT [ DISTINCT ]
FROM
WHERE
GROUP BY
HAVING
UNION
ORDER BY


а логика такая:

FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY
Ответ написан
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
если рассматривать на про уровне, то побные вещи вариантивны т.ч.фиксированного алгоритма нет.
explain и мануал в помощь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы