2011-01-02 8 views
0

私は以下のクエリのインデックスの最適な組み合わせを把握しようとしています。今はその一時的な使用; filesortを使用して、私のvpsを殺す。クエリには6〜10秒かかります。このWordPressのクエリを最適化するにはどうすればよいですか?

SELECT SQL_CALC_FOUND_ROWS 
    wp_posts.ID  
FROM 
    wp_posts 
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
    INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
    INNER JOIN wp_terms ON (wp_term_taxonomy.term_id = wp_terms.term_id) 
WHERE 
    1=1 
    AND wp_term_taxonomy.taxonomy = 'post_tag' 
    AND wp_terms.slug IN ('pie') 
    AND wp_posts.post_type = 'post' 
    AND (wp_posts.post_status = 'publish') 
GROUP BY 
    wp_posts.ID  
ORDER BY 
    wp_posts.post_date DESC 
LIMIT 0, 20 

+0

あなたの実行計画を含めることを忘れないでください。 – ajreal

答えて

1

これはどのようにパフォーマンスを比較していますか?

SELECT 
    p.ID 
FROM 
    wp_posts AS p 
WHERE 
    1=1 
    AND p.post_type = 'post' 
    AND p.post_status = 'publish' 
    AND EXISTS (
    SELECT 1 
     FROM wp_term_relationships AS r 
      INNER JOIN wp_term_taxonomy AS t ON 
      r.term_taxonomy_id = t.term_taxonomy_id AND t.taxonomy = 'post_tag' 
      INNER JOIN wp_terms AS m ON 
      m.term_id = t.term_id AND m.slug IN ('pie') 
    WHERE r.object_id = wp_posts.ID 
) 
ORDER BY 
    p.post_date DESC 
LIMIT 0, 20 

インデックスはwp_term_taxonomy.taxonomywp_posts.post_status, post_type, post_date以上の複合1に、wp_terms.slugに、すべての主キーと外部キーにする必要があります。

+0

私は複合インデックスを追加しましたが、クエリはそれを使用しませんでした。それはプライマリキーのインデックスに固執しました。残念ながら、私は本当にワードプレスの性質のために、クエリの構造を変更することはできませんが、私は助けに感謝します。 – Incognito

+0

何らかの理由で、上記のインデックスがクエリ全体の速度を遅くします。 Mysqlは、実行時間atleast 4x以上のテーブルの結合順序を変更するようです。なぜ私はインデックスが使用されていないことを拡張されたショーを説明してもわからない。 – Incognito

+0

@Incognito:それは単なる試みだった。すべての時間を追跡するには、クエリを段階的に実行します。まず、 'SELECT ID FROM wp_posts WHERE ...'だけで、JOINを1つずつ追加します。たぶんこれは問題の発見に役立ちます。 – Tomalak

関連する問題