ORDER BY avec une jointure
Le saviez-vous ? Le choix de l'ordre du tri a un incidence sur les performance du tri
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