:: DEVELOPER ZONE
A LEFT JOIN B est implémenté dans MySQL comme suit :
La table B est censée être dépendante de la
table A et de toutes les tables dont dépend A.
La table A est censée être dépendante de
toutes les tables (à part B) qui sont utilisées
dans la condition du LEFT JOIN.
Toutes les conditions du LEFT JOIN sont transmises à la clause WHERE.
Toutes les optimisations standards de jointures sont effectuées, à l'excepté qu'une table est toujours lue après celles dont elle dépend. S'il y a une dépendance circulaire, MySQL retournera une erreur.
Toutes les optimisations standards de WHERE sont effectuées.
S'il y a une ligne dans A qui répond à la clause WHERE, mais qu'il
n'y avait aucune ligne dans B qui répondait à la condition du LEFT JOIN,
alors une ligne supplémentaire de B est générée avec toutes les colonnes mises
à NULL.
Si vous utilisez LEFT JOIN pour trouver les enregistrements qui n'existent
pas dans d'autres tables et que vous effectuez le test suivant :
nom_colonne IS NULL dans la partie WHERE, où
nom_colonne est une colonne qui est déclarée
en tant que NOT NULL, alors MySQL arrêtera de chercher
d'autres lignes (pour une combinaison de clefs particulière) après avoir
trouvé une ligne qui répond à la condition du LEFT JOIN.
RIGHT JOIN est implémenté de manière analogue à LEFT JOIN.
L'ordre de lecture de tables forcé par LEFT JOIN et STRAIGHT JOIN
aidera l'optimiseur de jointures (qui calcule l'ordre dans lequel les tables doivent
être jointes) à faire son travail plus rapidement, puisqu'il y aura moins de permutations de
tables à vérifier.
Notez que ce qui précède signifie que si vous faites une requête de la sorte :
SELECT *
FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
WHERE b.key=d.key;
Un palliatif est de changer la requête en :
SELECT *
FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
WHERE b.key=d.key;
Depuis la version 4.0.14, MySQL effectue l'optimisation LEFT JOIN suivante :
si la condition WHERE est toujours fausse pour la ligne
NULL générée, la jointure LEFT JOIN
est transformée en jointure normale.
Par exemple, dans la requête suivante, la clause WHERE sera fausse si
t2.column est NULL : il est donc valide de convertir la jointure
en une jointure normale.
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
Par conséquent, il est possible de convertir la requête en jointure normale :
SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
Cela peut se faire plus rapidement, car MySQL peut maintenant utiliser la table t2
avant la table t1 si les relations sont plus favorables. Pour forcer l'utilisation
spécifique d'un ordre de table, utilisez STRAIGHT JOIN.
© 1995-2005 MySQL AB. All rights reserved.
