0

私は MU wordpress サイトで作業していますが、クエリに問題があり、実行に時間がかかりすぎます。

SELECT wp_posts.* 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_posts.blog_id = '1'
AND wp_term_taxonomy.taxonomy = 'post_tag' 
AND wp_terms.slug IN ('rate') 
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

ワードプレスで実行されるこのクエリは、実行に 30 ~ 40 秒かかりすぎます。

  • wp_posts : 4,00,000 行
  • wp_terms : 2,50,000 行
  • wp_term_relationship : 2,30,000 行
  • wp_term_taxonomy : 2,60,000 行

私はすでに(使用されている)列にインデックスを付けています。

4

2 に答える 2

0

将来的には、いつでも投稿を再編集して、コメントにダンプするのではなく、EXPLAIN (SQL ステートメント) のダンプのようなコンテンツを追加できます。

クエリ自体はかなり直接的で、Explain ごとのインデックスは問題ないように見えますが、WP_Posts テーブルについては、以下に基づいて変更 (または単に別のインデックスを追加) する可能性があります。

( Blog_ID, Post_Type, Post_Status, ID, Post_Date )

このように、最初に条件に一致し、次に GROUP BY を最適化するための ID、最後に Order By 句の Post_Date に一致します。

次に、エンジンが最初に他の参照テーブルで動作しようとしないように、キーワード「STRAIGHT_JOIN」を追加してみましたか...

SELECT STRAIGHT_JOIN wp_posts.* ... rest of query

私が検討する別の代替手段は、distinct を介して ID のみを事前にクエリし、WP_Posts テーブルに再び参加することです... SELECT * を実行して ID だけでグループ化することで窒息するかどうかはわかりません。

SELECT
      wp_posts.* 
   FROM 
      ( SELECT STRAIGHT_JOIN DISTINCT 
              WP.ID
           from 
              wp_posts WP
                 INNER JOIN wp_term_relationships WPR
                    ON WP.ID = WPR.object_id
                    INNER JOIN wp_term_taxonomy WPTT
                       ON WPR.term_taxonomy_id = WPTT.term_taxonomy_id
                       INNER JOIN wp_terms WPT
                          ON WPTT.term_id = WPT.term_id
           WHERE 
                  1 = 1 
              AND WP.blog_id = '1'
              AND WP.post_type = 'post' 
              AND WP.post_status = 'publish'
              AND WPTT.taxonomy = 'post_tag' 
              AND WPT.slug IN ('rate') 
           GROUP BY 
              WP.ID 
           ORDER BY 
              WP.post_date DESC 
           LIMIT
              0, 20 ) JustIDs
      JOIN WP_Posts
         on JustIDs.ID = WP_Posts.ID
于 2013-06-14T13:33:47.677 に答える