2013-02-20 3 views
10

Disons que j'ai la requête suivante. S'il n'y a pas de correspondance lors de la connexion de t1 et t2, toutes les autres jointures sont-elles ignorées par MySQL?Les SQL JOIN doivent-ils être placés dans un ordre particulier pour des raisons de performances?

Raison que je demande est que sinon, alors je vais rompre la requête et utiliser PHP pour le rassembler. S'il n'y a pas de hit de performance, alors je vais juste mettre mes JOINs dans un tel ordre qui ne continue pas une fois qu'un JOIN précédent ne le fait pas. Merci

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

Pour référence à quelqu'un d'autre à venir à travers cela comme je l'ai fait ... http://stackoverflow.com/questions/1018822/inner-join-on-vs-where-clause fournit beaucoup de détails sur le différences et avantages. – JeopardyTempest

Répondre

14

Le documentation pour les états MySQL "L'optimiseur de jointure calcule l'ordre dans lequel les tables doivent être jointes".

Cet ordre est déterminé en fonction des informations sur les tailles des tables et d'autres facteurs, tels que la présence d'index.

Vous devez placer les jointures dans l'ordre le plus approprié pour lire et gérer la requête.

+0

Merci Gordon. Donc, peu importe l'ordre dans lequel je l'ai mis, car MySQL le fera pour moi. Y a-t-il une chance que MySQL les mette dans un ordre différent de celui que j'ai listé, ce qui fera que beaucoup d'entre eux seront exécutés? – user1032531

+2

MySQL va faire toutes les jointures. Si vous avez des index sur les colonnes id dans les autres tables, le moteur utilisera l'index et les performances devraient être un problème. –

+1

Merci de citer la documentation! – Sonny

1

Je suppose qu'il n'y aurait pas un impact sur les performances. L'optimiseur de requête doit déterminer que la jointure entre t2 et t1 n'est pas valide et résoudre toutes les jointures de dépendance à une valeur constante, ce qui signifie qu'elles ne seront pas évaluées.

+0

Merci Steve. Ma conjecture est la même que la vôtre. À quel point pensez-vous que vous êtes? – user1032531

Questions connexes