7.2 Optimisation des commandes SELECT et autres requêtes
7 Optimisation de MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Syntaxe de EXPLAIN (Obtenir des informations sur les SELECT ) . Mesurer les performances d'une requête . Vitesse des requêtes SELECT . Comment MySQL optimise les clauses WHERE . Comment MySQL optimise la condition OR . Comment MySQL optimise IS NULL . Comment MySQL optimise DISTINCT ->Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN . Comment MySQL optimise ORDER BY . Comment MySQL optimise LIMIT . Comment éviter les scans de tables,,, . Vitesse des requêtes INSERT . Vitesses des commandes UPDATE . Rapidité des requêtes DELETE . Autres conseils d'optimisation
|
7.2.8 Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN
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
.
|