2010-12-08 33 views
3

J'ai besoin d'aide pour l'optimisation d'une requête. J'ai une requête qui prend trop de temps à courir 12s et j'aimerais si je pourrais obtenir de l'aide en essayant de l'optimiser car je ne suis pas un gourou sql. Ici, il est:Optimisation d'une jointure interne

SELECT ID           , 
     user_login         , 
     user_nicename        , 
     user_registered        , 
     user_status         , 
     display_name        , 
     t1.meta_value    AS account_type , 
     1 t2.meta_value   AS views   , 
     GROUP_CONCAT(t4.term_id) AS interests_skills, 
     GROUP_CONCAT(t4.taxonomy) AS taxonomyComb , 
     t4.term_id         , 
     t4.taxonomy 
FROM  wp_users 
     INNER JOIN wp_usermeta AS t1 
     ON  (
          t1.user_id = wp_users.ID 
        AND 
          (
            t1.meta_key = 'account_type' 
          AND  t1.meta_value = 'individual' 
          ) 
       ) 
     LEFT JOIN wp_usermeta AS t2 
     ON  (
          t2.user_id = wp_users.ID 
        AND  t2.meta_key = 'views' 
       ) 
     LEFT JOIN wp_term_relationships AS t3 
     ON  (
          t3.object_id = (1000000+wp_users.ID) 
       ) 
     INNER JOIN wp_term_taxonomy AS t4 
     ON  (
          (
            t3.term_taxonomy_id = t4.`term_taxonomy_id` 
          AND  t4.taxonomy   = 'category' 
          AND  t4.term_id IN (396,410,411,416,142,417) 
          ) 
        OR 
          (
            t3.term_taxonomy_id = t4.`term_taxonomy_id` 
          AND  t4.taxonomy   = 'skill' 
          AND  t4.term_id IN (461,463,464,466,490,468,470,491,473,474,475) 
          ) 
       ) 
WHERE t4.term_id IS NOT NULL 
GROUP BY ID LIMIT 0,10 

Voici le expliquer

1 SIMPLE gamme PRIMAIRE t4, term_id_taxonomy, taxonomie term_id_taxonomy 106 NULL 17 Utilisation où; En utilisant temporaire; Utilisation filesort

1 SIMPLE t1 ref user_id, meta_key meta_key 768 const 3773 Utilisation où

1 wp_users SIMPLE eq_ref PRIMAIRE PRIMARY 8 jasper_gi.t1.user_id 1

1 t2 SIMPLE ref user_id, meta_key meta_key 768 const 2

1 SIMPLE t3 eq_ref PRIMAIRE, term_taxonomy_id PRIMARY 16 func, jasper_gi.t4.term_taxonomy_id 1 Utilisation de where; À l'aide de l'index

+0

J'ai corrigé le formatage de la requête. En regardant l'historique des modifications, j'ai peut-être supprimé une phrase par inadvertance si ce n'était pas le cas! S'il vous plaît vérifier et re ajouter si nécessaire. –

Répondre

2

J'aime la disposition de votre SQL - très facile à lire.

Chaque fois que j'ai un problème comme celui-ci, j'essaie de le décomposer. Commencez avec votre table de base sans toutes les jointures et voyez comment elle fonctionne - regardez le plan de requête, validez les résultats, etc.

Ajoutez ensuite chaque jointure à la fois jusqu'à ce que vous voyiez le coupable. Peut-être un mélange de quelques-uns, peut-être des index manquants, etc Mais en travaillant systématiquement à travers les jointures comme ça, vous pouvez trouver les points de trouble et avoir une meilleure idée de ce qu'il faut faire.

+1

J'ai prétendu le SQL de l'OP en utilisant http://www.sqlinform.com/online.phtml! –

1

La première ligne d'attaque est sur les indices: avez-vous obtenu des indices composites définis sur:

t2/wp_usermeta: (user_id, meta_key) 
t3/wp_term_relationships: (objectid) 
t4/wp_term_taxonomy: (term_taxonomy_id, taxonomy, term_id) 

?

0

Avoir des index sur vos champs de jointure vous aidera un peu:

  • wp_usermeta.user_id
  • wp_users.ID
  • wp_term_relationships.objectid
  • wp_term_taxonomy.term_taxonomy_id
  • wp_term_taxonomy.taxonomy
  • wp_term_taxonomy.term_id