1

結果を返すのに1分半近くかかるので、ワードプレスで次のクエリを最適化しようとしています。テーブルの関係は、次の図で表されます。

ここに画像の説明を入力してください

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
4

3 に答える 3

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
于 2012-05-23T21:04:58.413 に答える
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

それほど多くの内部結合は必要ありません。

于 2012-05-23T21:01:18.027 に答える
0

複数の結合の背後にある考え方が、対応する25、26、17の投稿を取得することであった場合(これらのいずれかではなくすべての用語term_taxonomy_idを意味します)、1つのJOINだけでKayakJimの回答を再利用できます。5つの用語すべてに一致する行のみを保持して、句を追加します。HAVING

変更されたクエリは次のとおりです。

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
于 2012-05-23T23:30:14.087 に答える