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

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

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