Должны ли SQL JOINs размещаться в определенном порядке по соображениям производительности?

Скажем, у меня есть следующий запрос. Если нет совпадений при соединении t1 и t2, все остальные объединения игнорируются MySQL?

Причина, о которой я прошу, заключается в том, что если нет, то я разбрую запрос и использую PHP, чтобы собрать его вместе. Если нет удара производительности, я просто поставлю свои JOINs в таком порядке, который не будет продолжаться, как только предыдущий JOIN не сделает. Благодаря

SELECT whatever
FROM t1
INNER JOIN t2 ON t2.t1id=t1.id
INNER JOIN t3 ON t3.t2id=t2.id
INNER JOIN t4 ON t4.t3id=t3.id
INNER JOIN t5 ON t5.t4id=t4.id
INNER JOIN t6 ON t6.t5id=t5.id
INNER JOIN t7 ON t7.t6id=t6.id
INNER JOIN t8 ON t8.t7id=t7.id
INNER JOIN t9 ON t9.t8id=t8.id
WHERE t1.c=123 AND t4.c=321 AND t6.c=222 AND t9.c=222

Ответ 1

Документация для MySQL утверждает: "Оптимизатор объединения вычисляет порядок, в котором должны быть объединены таблицы".

Этот порядок определяется на основе информации о размерах таблиц и других факторах, таких как наличие индексов.

Вы должны поместить соединения в том порядке, который имеет наибольший смысл для чтения и ведения запроса.

Ответ 2

Я предполагаю, что не было бы удара производительности. Оптимизатор запросов должен определить, что соединение между t2 и t1 является недопустимым и разрешает все соединения зависимостей с постоянным значением, что означает, что они не будут оцениваться.