优化内部联接

时间:2010-12-08 14:11:19

标签: sql join query-optimization inner-join

我需要一些优化查询的帮助。我有一个查询需要花费太长时间才能运行12秒,如果我可以在尝试优化它时得到一些帮助,我会很高兴,因为我不是一个sql大师。这是:

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

这是解释

  

1 SIMPLE t4范围PRIMARY,term_id_taxonomy,taxonomy term_id_taxonomy 106 NULL 17使用where;使用临时;使用filesort

     

1 SIMPLE t1 ref user_id,meta_key meta_key 768 const 3773使用位置

     

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

     

1 SIMPLE t2 ref user_id,meta_key meta_key 768 const 2

     

1 SIMPLE t3 eq_ref PRIMARY,term_taxonomy_id PRIMARY 16 func,jasper_gi.t4.term_taxonomy_id 1使用where;使用索引

3 个答案:

答案 0 :(得分:2)

我喜欢你的SQL布局 - 非常容易阅读。

每当我遇到这样的问题时,我都会尝试将其分解。从没有所有连接的基表开始,看看它是如何执行的 - 查看查询计划,验证结果等。

然后一次添加一个连接,直到看到罪魁祸首。可能是一些混合,可能是一些缺失的索引,等等。但通过系统地通过这样的连接工作,你可以找到麻烦点,并更好地了解该做什么。

答案 1 :(得分:1)

攻击的第一道攻击是:你有没有定义复合索引:

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

答案 2 :(得分:0)

在您的加入字段上设置索引会有所帮助:

  • 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