2016-02-20 76 views
0

我在WordPress中運行一些非常大的表時有以下查詢。有沒有辦法重新組織它,使其運行速度更快?目前需要8秒鐘,而且對於我需要稱之爲600K次的用例來說太慢了。該位wp_term_taxonomy.term_id = 18將是動態的,如:wp_term_taxonomy.term_id = category_id如何讓MySql WordPress查詢運行得更快?

SELECT `ID` AS athlete_id, `post_title` AS athlete_name, `post_name` AS athlete_slug, 
     body_weight.weight, performance.speed 
    FROM `wp_posts` 
    INNER JOIN 
     (SELECT `post_id`, `meta_value` AS weight 
      FROM `wp_postmeta` 
      WHERE (`meta_key` = 'athlete_weight') 
    ) body_weight ON wp_posts.ID = body_weight.post_id 
    INNER JOIN 
     (SELECT `post_id`, `meta_value` AS speed 
      FROM `wp_postmeta` 
      WHERE (`meta_key` = 'athlete_speed') 
    ) performance ON wp_posts.ID = performance.post_id 
    LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
    LEFT JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = 
             wp_term_taxonomy.term_taxonomy_id) 
    LEFT JOIN wp_terms ON (wp_terms.term_id = wp_term_taxonomy.term_id) 
    WHERE wp_posts.post_status = 'publish' 
     AND wp_posts.post_type = 'athlete' 
     AND ((wp_term_taxonomy.taxonomy = 'athletics_category' 
         AND wp_term_taxonomy.term_id = 18) 
       OR (wp_terms.term_id is null) 
      ); 

回答

0

使用一個以上的JOIN子查詢是因爲缺乏在TMP表的索引,特別是低效率的。 (是的,5.6增加了對飛的指數,但是這仍然是低效率)

相反,JOIN表,而不是一個子查詢:

SELECT ... 
    ms.meta_value AS speed 
    ... 
FROM ... 
JOIN wp_postmeta AS ms 
    ON ms.post_id = wp_posts.ID 

(同上,用於其他的,但使用不同的別名)

(這就是爲什麼EAV模式是一個痛苦的一個例子。)

+0

非常感謝!差別很大!查詢現在在0.6秒內運行... – KalenGi