Bonjour,
Je cherche a optimiser certaines requetes que je retrouve dans le log des slow query.
J'ai une requete en particulier qui me pose probleme.
Il s'agit d'une requete sur 3 tables :
recherche,abonnements,coord_recherche :
-la table recherche regroupe le nom,prénom des individus
-la table coord_recherche les informations telles que adresse,ville,pays
-la table abonnements contient les informations sur leur abonnements (type d'abonnements, validation, rubrique de l'abonnement etc).
la requete en question est
Elle a pour but de retourner le nombre d'abonnés correspondant aux criteres de recherche (ici il s'agit d'une recherche sur le pays) par rubrique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 SELECT DISTINCT id_rubrique, COUNT( abonnements.id_abonnement ) AS compte FROM abonnements JOIN recherche on abonnements.id_abonnement= recherche.id_abonnement JOIN coord_recherche on coord_recherche.id_abonnement=abonnements.id_abonnement WHERE coord_recherche.country =1 AND online =1 GROUP BY id_rubrique;
La table mise en jeu sont pourtant correctement indexé :
index sur id_abonnement dans recherche et coord_recherche (puisqu'il s'agit d'une clé étrangère).
index sur country dans la table coord_recherche.
Pour y voir plus clair , j'ai fait un EXPLAIN de cette requete et je vois que mes index sur la table coord_recherche sont ignorés :
Voici le résultat du EXPLAIN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 table type possible_keys key key_len ref rows Extra coord_recherche ALL country,id_abonnement NULL NULL NULL 70389 Using where; Using temporary; Using filesort abonnements eq_ref PRIMARY PRIMARY 4 coord_recherche.id_abonnement 1 Using where recherche ref id_abonnement id_abonnement 5 abonnements.id_abonnement 1 Using where; Using index
La table coord_recherche est parcouru dans son intégralité alors que 2 clés sont possibles et aucunes n'est utilisée.
Pouvez vous m'expliquer ce qui amene MySQL a ignorer ces index ? Que puis-je faire pour optimiser cette requete (son temps d'execution est pour le moment de 5 sec).
Partager