我使用了一个非常简单的wp\\u查询,在站点上检索了10篇帖子,超过10万篇。
此查询在wp多站点上运行,对同一网络(同一db服务器)中的小站点执行相同的查询需要很少的毫秒(0.032888 | 0.021731 | 0.020796 | 0.02127)
主要问题是什么时候尝试在大型网站上运行它(增加10万个帖子)。
wp\\U查询转储为:
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\\U查询->请求:
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)
当前行数
非常感谢您的建议
SO网友:Tom J Nowell
罪魁祸首是:
[meta_query] => Array
(
[0] => Array
(
[key] => city
[value] => Las Vegas
[compare] => =
)
)
元查询速度很慢,唯一加快的方法是不使用元查询。
post元表经过优化,可以在post ID已知的情况下获取键/值对。这就是为什么get_post_meta
速度很快。
但是对于搜索和过滤帖子,或者通过其meta查找/搜索帖子,性能非常差。这是经过设计的,以便快速获取帖子元。
那么,如何根据帖子的数据过滤/搜索/查找帖子呢?
分类法(taxonomy)
分类法表是为在您知道术语ID/名称时查找帖子而设计的。这就是标记和类别的构建方式,也是为什么它们比元查询快得多的原因。
根本问题是你的city
post meta应该是一种自定义分类法。移动到自定义分类法将在数量级上提高查询速度。
请记住:
如果您需要列出搜索查询组或按信息筛选帖子,use a custom taxonomy
如果您仅在已有帖子的情况下使用信息,例如,您正在显示帖子,并且不需要过滤/查询该数据,请使用post meta,如果您有更复杂的值,如价格,请不要害怕同时使用这两种或近似值