2010-05-27 119 views
0

我有一个查询创建一个表视图,然后另一个查询视图。结果非常缓慢。 下面是代码:wordpress查询自定义字段和类别

create or replace view $view_table_name as select * from wp_2_postmeta where post_id IN (       
         select ID FROM wp_2_posts wposts 
          LEFT JOIN wp_2_term_relationships ON (wposts.ID = wp_2_term_relationships.object_id) 
          LEFT JOIN wp_2_term_taxonomy ON (wp_2_term_relationships.term_taxonomy_id = wp_2_term_taxonomy.term_taxonomy_id) 
         WHERE wp_2_term_taxonomy.taxonomy = 'category' 
          AND wp_2_term_taxonomy.parent = $cat || wp_2_term_taxonomy.term_id = $cat                              
          AND wposts.post_status = 'publish' 
          AND wposts.post_type = 'post') 

的$值已经把它在这个例子中,查询视图表的结果。

select distinct(ID) 
FROM $view_table_name wposts 
    LEFT JOIN wp_2_postmeta wpostmeta 
     ON wposts.ID = wpostmeta.post_id 
WHERE post_status = 'publish' 
    AND ID NOT IN (SELECT post_id 
        FROM wp_2_postmeta 
        WHERE meta_key = '$var' && meta_value = '$value1') 
    AND ID NOT IN (SELECT post_id 
        FROM wp_2_postmeta 
        WHERE meta_key = '$var' && meta_value = '$value2') 
    AND ID NOT IN (SELECT post_id 
        FROM wp_2_postmeta 
        WHERE meta_key = '$var' && meta_value = '$value3') 
    AND postmeta.meta_key = 'pd_form' 
ORDER BY CASE wpostmeta.meta_value 
      WHEN '$value5' THEN 1 
      WHEN '$value6' THEN 2 
      WHEN '$value7' THEN 3 
      WHEN '$value8' THEN 4 
      WHEN '$value9' THEN 5 
      WHEN '$value10' THEN 6 
      WHEN '$value11' THEN 7 
      WHEN '$value11' THEN 8 
     END; 

回答

1

这里的主要问题是IN条件下的子查询。取而代之的是执行子查询,然后检查外部表中的对应关系,已知MySQL将查询转换为对外部表中每行执行的相关子查询。

通常的解决方案是摆脱IN中的子查询以支持JOIN。

另一个问题是,你使用OUTER JOIN,而不是内部JOIN虽然你实际上并不需要它(MySQL的通常是足够聪明来优化它时,它是平凡的,但无论如何,你应该更清楚地表达你的意图)。

还有一件事。这两个查询似乎都是动态生成的。除了优化查询本身之外,还应该考虑如何不打破调用代码。虽然这可能会很棘手。

优化wordpress总是一个有趣的挑战。

相关问题