| 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
 . Optimisation d'intervalle
 . Optimisation de combinaison d'index
 . 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 les clauses GROUP BY
 . Comment MySQL optimise LIMIT
 . Comment éviter les analyses de tables
 . Vitesse des requêtes INSERT
 . Vitesses des commandes UPDATE
 . Rapidité des requêtes DELETE
 . Autres conseils d'optimisation
 
 
 | 
  7.2.9 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 :
 Un palliatif est de changer la requête en :| 
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;
 | 
 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 b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
 WHERE b.key=d.key;
 | 
 Par conséquent, il est possible de convertir la requête en jointure normale :| 
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
 | 
 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
 .| 
SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
 | 
 |