Bonjour
Voici une des requêtes que je n'arrive pas à optimiser. (EXPLAIN m'indique toujours en extra using filesort).
Mes tables :
La requête
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 TABLE : t_bloc // table des articles id_bloc article date_modif id_membre_bloc // indique l'id du membre qui a posté l'article, 0 si il s'agit d'un article posté par moi même ... (dans mon test il y a 170 000 enregistrements dans cette table) TABLE : t_taxon_bloc //table qui relie les taxons (rubriques, tags.... et les articles) (table de relation) id_taxon id_bloc (il y a 215 000 enregistrements dans cette table) TABLE : t_taxon id_taxon taxon (<-- nom de la rubrique/tag etc.) parent_id (id du taxon parent : exemple si une rubrique appartient à une catégorie qui elle même est un taxon)
J'ai 166 000 articles qui répondent aux critères du where. je demande à en récupérer que 10 sachant que date_modif est un index , idem pour parent_id, id_taxon et id_bloc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT B.id_bloc, B.date_modif FROM t_bloc AS B INNER JOIN t_taxon_bloc AS TB ON (TB.id_bloc=B.id_bloc) INNER JOIN t_taxon T ON (T.id_taxon=TB.id_taxon) WHERE T.parent_id=66 ORDER BY B.date_modif DESC limit 10
Dans t_taxon_bloc la clé primaire c'est (id_taxon, id_bloc), dans t_bloc c'est id_bloc, dans t_taxon c'est id_taxon (voir les tables plus bas)
Il met 2,65s pour me retourner les 10 demandés ou seulement 0,0006s sans le order by
Le explain m'indique ceci :
On voit bien cette ligne pour la table T : Using temporary; Using filesort ce qui est très mauvais en terme de perf à mon avis, mais impossible de m'en débarrasser.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE T ref PRIMARY,parent_id parent_id 4 const 7 Using temporary; Using filesort 1 SIMPLE TB ref PRIMARY PRIMARY 4 T.id_taxon 2150 Using index 1 SIMPLE B eq_ref PRIMARY PRIMARY 4 TB.id_bloc 1
on voit également que B n'utilise pas l'index date_modif
rows pour les 3 tables ne me semble pas énorme et ne semble pas justifier ces 2,65s de temps d'execution :/
Petite précision mes table utilisent le moteur Myisam
Partager