web-dev-qa-db-ja.com

Wp_queryを高速化する方法、100kの投稿に対して5秒以上かかる

私は非常に単純なwp_queryを使用して、10万件以上の投稿を含む10件の投稿を取得しました。

このクエリはwp-multiサイトで実行され、同じネットワーク(同じdbサーバー)内の小さなサイトに対して同じクエリを実行すると、数ミリ秒かかりました(0.032888 | 0.021731 | 0.020796 | 0.02127)。

主な問題は、巨大なサイト(+ 100kの投稿)でそれを実行しようとしたときです。

Wp_queryダンプは以下のとおりです。

print_r($args);

// output
Array
(
    [post_type] => post
    [posts_per_page] => 10
    [paged] => 
    [orderby] => date
    [order] => DESC
    [meta_query] => Array
        (
            [0] => Array
                (
                    [key] => city
                    [value] => Las Vegas
                    [compare] => =
                )

        )

    [cat] => 2
)

$ wp_query-> requestのダンプ

SELECT SQL_CALC_FOUND_ROWS wpui_2_posts.id 
FROM   wpui_2_posts 
       LEFT JOIN wpui_2_term_relationships 
              ON ( wpui_2_posts.id = wpui_2_term_relationships.object_id ) 
       INNER JOIN wpui_2_postmeta 
               ON ( wpui_2_posts.id = wpui_2_postmeta.post_id ) 
WHERE  1 = 1 
       AND ( wpui_2_term_relationships.term_taxonomy_id IN ( 2 ) ) 
       AND (( wpui_2_postmeta.meta_key = 'city' 
              AND wpui_2_postmeta.meta_value = 'las vegas' )) 
       AND wpui_2_posts.post_type = 'post' 
       AND ( wpui_2_posts.post_status = 'publish' 
              OR wpui_2_posts.post_status = 'private' ) 
GROUP  BY wpui_2_posts.id 
ORDER  BY wpui_2_posts.post_date DESC 
LIMIT  0, 10 

MySQLからの説明文

ID  select_type table   type    possible_key    key key_len ref rows    Extra
1   SIMPLE  wpui_2_term_relationships   ref PRIMARY,term_taxonomy_id    term_taxonomy_id    8   const   59097   Using index; Using temporary; Using filesort
1   SIMPLE  wpui_2_posts    eq_ref  PRIMARY,type_status_date    PRIMARY 8   wpdb.wpui_2_term_relationships.object_id   1   Using where
1   SIMPLE  wpui_2_postmeta ref post_id,meta_key    post_id 8   wpdb.wpui_2_term_relationships.object_id   3   Using where

このクエリは非常に長い時間がかかりました(5.715333 | 6.295236 | 5.110536 | 5.138607 | 5.164155)

現在の行数

  • wpui_2_posts 209548
  • wpui_2_term_relationships 118156
  • wpui_2_postmeta 2087567

任意の提案は本当に感謝しています

2
Mark

これが原因です。

[meta_query] => Array
    (
        [0] => Array
            (
                [key] => city
                [value] => Las Vegas
                [compare] => =
            )

    )

メタクエリは遅く、それらをスピードアップする唯一の方法はメタクエリを使わないことです。

投稿メタテーブルは、投稿IDがすでにわかっているキー/値ペアを取得するために最適化されています。 get_post_metaが速いのはそのためです。

しかし、投稿を検索して除外したり、投稿をメタで検索/検索したりする場合、パフォーマンスは非常に低くなります。これは仕様によるもので、ポストメタの取得は高速です。

それでは、どのようにそれらのデータに基づいて投稿をフィルタリング/検索/検索しますか?

タクソノミー

分類表は、用語ID /名前がわかっている場合に投稿を見つけるように設計されています。これがタグとカテゴリの構築方法であり、メタクエリよりもはるかに速い理由です。

根本的な問題はあなたのcity投稿メタがカスタム分類法であるべきだったということです。カスタム分類法に移行すると、クエリの速度が大幅に向上します。

覚えておいてください:

  • 検索クエリグループを一覧表示したり、情報で投稿を絞り込む必要がある場合は、 カスタム分類法を使用します
  • すでに投稿しているときにのみ情報を使用している場合は、あなたは投稿を表示しています、そしてあなたはそのデータのためにフィルタ/クエリをする必要はありません、投稿メタを使用してください

価格のようにもっと複雑な値がある場合は、両方または近似値を使用することを恐れないでください。

2
Tom J Nowell