2013-02-20 3 views
10

Nehmen wir an, ich habe die folgende Abfrage. Wenn beim Verbinden von t1 und t2 keine Übereinstimmungen vorhanden sind, werden alle anderen Verknüpfungen von MySQL ignoriert?Sollen SQL-JOINs aus Performance-Gründen in eine bestimmte Reihenfolge gebracht werden?

Grund Ich frage ist, dass wenn nicht, dann werde ich die Abfrage aufbrechen und PHP verwenden, um es zusammenzufügen. Wenn es keinen Performance-Hit gibt, werde ich meine JOINs einfach in eine Reihenfolge bringen, die nicht weitergeht, wenn ein vorhergehender JOIN nicht gemacht wird. Danke

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

Für einen Hinweis auf jemand anderen über die Straße wie ich ... http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause bietet eine Menge Details auf der Unterschiede und Vorteile. – JeopardyTempest

Antwort

14

Die documentation für MySQL-Staaten "Der Join-Optimierer berechnet die Reihenfolge, in der Tabellen verbunden werden sollen".

Diese Reihenfolge wird basierend auf Informationen über die Größen der Tabellen und andere Faktoren wie das Vorhandensein von Indizes bestimmt.

Sie sollten die Joins in der Reihenfolge einfügen, die zum Lesen und Pflegen der Abfrage am sinnvollsten ist.

+0

Danke Gordon. Es ist also egal, in welcher Reihenfolge "I" steht, da MySQL es für mich tut. Gibt es eine Chance, dass MySQL sie in eine andere Reihenfolge bringt, als ich sie aufgelistet habe, was dazu führen wird, dass einige von ihnen ausgeführt werden? – user1032531

+2

MySQL wird alle Joins tun. Wenn Sie Indizes für die ID-Spalten in den anderen Tabellen haben, verwendet die Engine den Index und die Leistung sollte kein Problem sein. –

+1

Danke für das Zitieren der Dokumentation! – Sonny

1

Meine Vermutung ist, dass es keinen Leistungseinbruch geben würde. Der Abfrageoptimierer sollte feststellen, dass die Verknüpfung zwischen t2 und t1 ungültig ist, und alle Abhängigkeitsjoins auf einen konstanten Wert auflösen, was bedeutet, dass sie nicht ausgewertet werden.

+0

Danke Steve. Meine Vermutung ist die gleiche wie deine. Wie sicher glaubst du, dass du bist? – user1032531

Verwandte Themen