Bonjour,
Je travaille sur une base de donnée qui commence à prendre de l'ampleur, et j'ai noté qu'une requête était de plus en plus lente, alors qu'elle me semblait somme toute très simple.
Quelques informations concernant mes tables :
- user (clé primaire : id) contient dans les 130 000 enregistrements
- userRole (clé primaire : id, index : userId) contient aussi environ 130 000 enregistrements.
- Résultats retournés, environ 100 000.
Ce qui m'a étonné, c'est que la même requête, sans le ORDER BY user.id DESC s'exécute 80 fois plus vite...
Voici ce que j'obtiens en utilisant EXPLAIN :
- Requête initiale (temps d'exécution : 1.5 secondes) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT user.* FROM user LEFT OUTER JOIN user_role AS tRoles ON tRoles.userId = user.id WHERE tRoles.roleId = 5 ORDER BY user.id DESC- Requête sans le ORDER BY (temps d'exécution : 0.0186 secondes) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE tRoles ref userId,roleId roleId 4 const 66483 Using temporary; Using filesort 1 SIMPLE user eq_ref PRIMARY PRIMARY 4 amimalin2.com.tRoles.userId 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT user.* FROM user LEFT OUTER JOIN user_role AS tRoles ON tRoles.userId = user.id WHERE tRoles.roleId = 5- Requête alternative que j'ai trouvé (temps d'exécution : 0.0029 secondes) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE tRoles ref userId,roleId roleId 4 const 66483 1 SIMPLE user eq_ref PRIMARY PRIMARY 4 amimalin2.com.tRoles.userId 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT user.* FROM user LEFT OUTER JOIN user_role AS tRoles ON tRoles.userId = user.id WHERE tRoles.roleId = 5 ORDER BY tRoles.userId DESCMa question : Pourquoi la première requête (qui tri selon user.id qui est une clé primaire) prend autant de temps, comme si MySQL faisait le tri sur une colonne non-indexée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE tRoles ref userId,roleId roleId 4 const 66483 Using where; Using filesort 1 SIMPLE user eq_ref PRIMARY PRIMARY 4 amimalin2.com.tRoles.userId 1
Merci d'avance !
Edit - Question légèrement changée suite à une erreur dans une des requêtes, et donc des résultats associés
Partager