AboutPostsTalksOpen sourceProjectsPodcastsVideosToolsResumeContact

ORDER BY avec une jointure

Le saviez-vous ? Le choix de l'ordre du tri a un incidence sur les performance du tri

Photo by benjamin lehman on Unsplash.
Photo by benjamin lehman on Unsplash.

Le saviez-vous ?

Le choix des champs pour l’ordre de tri est important dans une requête SQL.

Prennez par exemple la requête suivante :

SELECT *FROM `ma_table_a` aINNER JOIN `ma_table_b` b ON (a.`aid` = b.`aid`)ORDER BY b.`aid` DESC

En plaçant un index sur le champ b.aid, celui-ci sera utilisé dans la requête, et celle-ci sera très rapide.

En réalité, ce n’est pas le cas. L’utilisation de cet index n’est absolument pas bon et vous allez probablement autant de temps à executer la requête que s’il n’y en avait pas.

Pourquoi ?

Dans ce genre de requête, vous avez le tri qui est executé à la fin de la requête, juste avant le renvoi des données.

Le tri est executé sur une table temporaire qui ne contient pas d’index, et donc pas celui de la table ma_table_b.

Comment corriger le problème ?

Si l’on choisit un index de la première table ma_table_a, celle de la close FROM, le tri sera effectué avant la jointure, et l’on peut ainsi bénéficier totalement de l’index de la table placé sur aid :

SELECT *FROM `ma_table_a` aINNER JOIN `ma_table_b` b ON (a.`aid` = b.`aid`)ORDER BY a.`aid` DESC

Sur ce problème, en changeant la close ORDER BY par celle de la première table, je passe d’une requête de plus de 5 secondes… à 10ms.

  • Moteur utilisé : MyISAM
  • Nombre d’enregistrements : 130 000 / table
You liked the post? Consider donating!
Become a patron
Buy me a coffee