2010-05-27 115 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總是一個有趣的挑戰。

相關問題