5.2 Optimisation des SELECT s et autres requêtes
5 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 clause DISTINCT ->Comment MySQL optimise LEFT JOIN et RIGHT JOIN . Comment MySQL optimise les clauses ORDER BY . Comment MySQL optimise la clause LIMIT . Vitesse des requêtes INSERT . Vitesses des commandes UPDATE . Rapidité des requêtes DELETE . Autres conseils d'optimisation
|
5.2.6 Comment MySQL optimise 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 (d.key=a.key) WHERE b.key=d.key
|
MySQL fera une recherche complète sur
b
puisque le
LEFT JOIN
forcera
sa lecture avant celle de
d
. Un palliatif est de changer la requête en :
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) WHERE b.key=d.key
|
|