私は非常に単純な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)
現在の行数
任意の提案は本当に感謝しています
これが原因です。
[meta_query] => Array
(
[0] => Array
(
[key] => city
[value] => Las Vegas
[compare] => =
)
)
メタクエリは遅く、それらをスピードアップする唯一の方法はメタクエリを使わないことです。
投稿メタテーブルは、投稿IDがすでにわかっているキー/値ペアを取得するために最適化されています。 get_post_meta
が速いのはそのためです。
しかし、投稿を検索して除外したり、投稿をメタで検索/検索したりする場合、パフォーマンスは非常に低くなります。これは仕様によるもので、ポストメタの取得は高速です。
それでは、どのようにそれらのデータに基づいて投稿をフィルタリング/検索/検索しますか?
分類表は、用語ID /名前がわかっている場合に投稿を見つけるように設計されています。これがタグとカテゴリの構築方法であり、メタクエリよりもはるかに速い理由です。
根本的な問題はあなたのcity
投稿メタがカスタム分類法であるべきだったということです。カスタム分類法に移行すると、クエリの速度が大幅に向上します。
覚えておいてください:
価格のようにもっと複雑な値がある場合は、両方または近似値を使用することを恐れないでください。