2012-05-23 86 views
1

我想在wordpress中優化以下查詢,因爲它需要將近一分半鐘才能返回結果。表關係表示如下圖:優化mysql查詢 - 許多內部聯接

enter image description here

SELECT SQL_CALC_FOUND_ROWS wp_posts . * 
    FROM wp_posts 
     INNER JOIN wp_term_relationships 
     ON (wp_posts.ID = wp_term_relationships.object_id) 
     INNER JOIN wp_term_relationships AS tt1 
     ON (wp_posts.ID = tt1.object_id) 
     INNER JOIN wp_term_relationships AS tt2 
     ON (wp_posts.ID = tt2.object_id) 
     INNER JOIN wp_term_relationships AS tt3 
     ON (wp_posts.ID = tt3.object_id) 
     INNER JOIN wp_term_relationships AS tt4 
     ON (wp_posts.ID = tt4.object_id) 
    WHERE 1 = 1 
     AND (
      wp_term_relationships.term_taxonomy_id IN (25) 
      OR tt1.term_taxonomy_id IN (26) 
      OR tt2.term_taxonomy_id IN (16) 
      OR tt3.term_taxonomy_id IN (17) 
      OR tt4.term_taxonomy_id IN (18) 
     ) 
     AND wp_posts.post_type IN ('product') 
     AND (wp_posts.post_status = 'publish') 
    GROUP BY wp_posts.ID 
    ORDER BY wp_posts.post_title ASC 
    LIMIT 0 , 15 
+0

我有困難,理解你正試圖在這裏實現什麼:

這裏將是修改後的查詢。也許你可以給我們提供一個最重要的實體的明確解釋和你試圖得到的結果? – Lukx

回答

1

我不明白wp_term_relationships表中所有內部連接的要點,當它看起來像是在尋找一系列值時。以下不會執行相同的執行速度嗎?

SELECT SQL_CALC_FOUND_ROWS wp_posts . * 
    FROM wp_posts 
     INNER JOIN wp_term_relationships 
     ON (wp_posts.ID = wp_term_relationships.object_id) 
    WHERE wp_term_relationships.term_taxonomy_id IN (25, 26, 16, 17, 18) 
     AND wp_posts.post_type = 'product' 
     AND wp_posts.post_status = 'publish' 
    GROUP BY wp_posts.ID 
    ORDER BY wp_posts.post_title ASC 
    LIMIT 0 , 15 
0

試試這個。我認爲這會更快。

SELECT SQL_CALC_FOUND_ROWS wp_posts . * 
FROM wp_posts, 
    wp_term_relationships 
WHERE wp_posts.ID = wp_term_relationships.object_id 
AND wp_term_relationships.term_taxonomy_id IN (25,26,16,17,18) 
AND wp_posts.post_type = 'product' 
AND wp_posts.post_status = 'publish' 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_title ASC 
LIMIT 0 , 15 

你不需要這麼多INNER JOINS。

0

如果多背後的想法加入是與相應的25 term_taxonomy_id也是26和17也...(意爲條款的全部,而不是任何人的)檢索帖子,您可以重複使用KayakJim的答案只有一個JOIN並添加一個HAVING子句,只保留與所有5個詞匹配的行。

SELECT SQL_CALC_FOUND_ROWS wp_posts . * 
    FROM wp_posts 
     INNER JOIN wp_term_relationships 
     ON (wp_posts.ID = wp_term_relationships.object_id) 
    WHERE wp_term_relationships.term_taxonomy_id IN (25, 26, 16, 17, 18) 
     AND wp_posts.post_type = 'product' 
     AND wp_posts.post_status = 'publish' 
    GROUP BY wp_posts.ID 
    HAVING count(*)=5 
    ORDER BY wp_posts.post_title ASC 
    LIMIT 0 , 15