2011-11-18 1 views
3

J'ai une requête many-to-many que j'aimerais optimiser, quels index dois-je créer pour cela?sql optimisation des index de requête many-to-many

SELECT (SELECT COUNT(post_id) 
      FROM posts 
      WHERE post_status = 1) as total, 
     p.*, 
     GROUP_CONCAT(t.tag_name) tagged 
    FROM tags_relation tr 
    JOIN posts p ON p.post_id = tr.rel_post_id 
    JOIN tags t ON t.tag_id = tr.rel_tag_id 
    WHERE p.post_status=1 
GROUP BY p.post_id 

EXPLIQUEZ

id select_type table type possible_keys key key_len ref rows Extra 
1 PRIMARY  p ALL PRIMARY NULL NULL NULL  5 Using where; Using filesort 

Répondre

3

Vous pouvez jeter un oeil sur le plan d'exécution de la requête en utilisant l'instruction Explain. Cela vous montrera si une analyse de table complète est en cours ou si elle a été capable de trouver un index pour récupérer les données. À partir de ce moment, vous pouvez optimiser davantage.

Modifier

Sur la base de votre plan d'exécution des requêtes, première étape d'optimisation vérifier vos tables ont la clé primaire définie et vous pouvez définir un index sur les colonnes de post_status et tag_name.

+0

+1: Quasiment tâtonnement, et il dépend des données et la façon dont il est accessible ... –

+0

ici est le résultat PRIMAIRE, post_status \t post_status const En utilisant où; Utilisation de filesort – dsportesa

+0

Maintenant, votre requête dispose de post_status en tant que clé, contrairement à votre plan d'exécution précédent qui était NULL. –