2013-02-20 2 views
10

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

Причина, о которой я прошу, заключается в том, что если нет, то я разбвлю запрос и использую 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 
+0

Для ссылки на кого-либо еще, проходящего по этой дороге, как я это сделал ... http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause предоставляет много подробностей о различий и преимуществ. – JeopardyTempest

ответ

14

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

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

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

+0

Спасибо Гордон. Поэтому не имеет значения, какой заказ «я» вложил, поскольку MySQL сделает это для меня. Есть ли вероятность того, что MySQL поместит их в другом порядке, чем я их перечислил, что приведет к их запуску? – user1032531

+2

MySQL собирается делать все соединения. Если у вас есть индексы в столбцах id в других таблицах, тогда движок будет использовать индекс, а производительность должна быть не проблема. –

+1

Благодарим за цитирование документации! – Sonny

1

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

+0

Спасибо Стив. Моя догадка такая же, как твоя. Как вы уверены, что думаете? – user1032531

Смежные вопросы