Comment MySQL optimise DISTINCT
<<<
Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN Comment MySQL optimise ORDER BY
>>>

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 .

<< Comment MySQL optimise les clauses LEFT JOIN et RIGHT JOIN >>
Comment MySQL optimise DISTINCT Optimisation des commandes SELECT et autres requêtes Comment MySQL optimise ORDER BY