Quick Tip – ORDER BY avec une jointure

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` a
INNER 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` a
INNER 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

Publicités

Auteur : Bruno Sabot

Développeur Front end, Mobile, Ergonomie, UX

4 réflexions sur « Quick Tip – ORDER BY avec une jointure »

  1. Merci beaucoup Bruno pour cet article, aussi minimaliste qu’il soit, il apporte son lot d’info 😉
    Keep the good work!
    Et à ta question « le saviez-vous », non je ne le savais pas.

    J'aime

  2. Je te rassure, moi non plus je n’aime pas utiliser le *

    Ici, c’est vraiment pour faire simple, mais j’aurais peut-être du mettre une remarque à ce propos…

    J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s