2013-01-05 69 views
1

如何通過此查詢獲得更快的結果?如何優化此查詢並使其更快地執行?

SELECT 
    post_id 
FROM 
    wp_postmeta 
WHERE 
    meta_key='wpcf-cooler-name' AND (
     post_id IN (
      SELECT 
       post_id 
      FROM 
       wp_postmeta 
      WHERE 
       meta_key='wpcf-cooler-name' AND 
       meta_value LIKE '%sosa%' AND (
        post_id IN (
         SELECT 
          object_id AS 'post_id' 
         FROM 
          wp_term_relationships 
         WHERE 
          term_taxonomy_id=227 
        ) 
       ) AND (
        post_id IN (
         SELECT 
          ID AS 'post_id' 
         FROM 
          wp_posts 
         WHERE 
          post_type='cooler' AND 
          post_status='publish' 
        ) 
       ) 
     ) 
    ) ORDER BY meta_value ASC 

我的數據庫有超過15000個條目。因此需要時間才能顯示結果。

+0

是此查詢工作? –

+0

你不能使用JOIN而不是子查詢嗎?此外,請確保您的所有相關字段都已編入索引,例如'meta_key','post_id','term_taxonomy_id' ... – mpen

+0

**您需要向我們顯示錶格和索引定義**診斷慢速查詢需要完整的表格和索引定義,而不僅僅是描述或解釋。也許你的表格定義不好。也許索引沒有正確創建。也許你沒有一個你認爲你做過的那個專欄的索引。沒有看到表和索引定義,我們不能說。 –

回答

3

使用WHERE條件:

SELECT 
    post.id 
FROM 
    wp_posts as post, wp_postmeta as postmeta, wp_term_relationships as relationships 
WHERE 
    postmeta.meta_key='wpcf-cooler-name' 
    AND postmeta.meta_value LIKE '%sosa%' 
    AND relationships.object_id = post.post_id 
    AND relationships.term_taxonomy_id = 227 
    AND post.ID = postmeta.post_id 
    AND post.post_type = 'cooler' 
    AND post.post_status='publish' 
ORDER BY postmeta.meta_value ASC 
0

試試這個:

SELECT wp.post_id 
FROM wp_postmeta wp 
INNER JOIN (SELECT object_id AS 'post_id' 
      FROM wp_term_relationships 
      WHERE term_taxonomy_id = 227 
     UNION 
      SELECT ID AS 'post_id' 
      FROM wp_posts 
      WHERE post_type = 'cooler' AND post_status = 'publish') A ON wp.post_id = A.post_id 
WHERE wp.meta_key = 'wpcf-cooler-name' AND wp.meta_value LIKE '%sosa%' 
ORDER BY wp.meta_value;