对大型数据库的查询速度较慢

时间:2018-03-10 作者:John M.

我有一个巨大的数据库,有超过250000篇帖子。我已经进行了所有可能的优化,并在互联网上搜索了所有可能的解决方案。

假设我有一个查询,我想从其中获取类别中的最后4篇帖子:

$recent = new WP_Query(array( \'cat\' => \'8\', \'posts_per_page\' => \'4\')); 
哪个查询监视器转换为:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (8,9,10,11,12,13,14,15) )
AND wp_posts.post_type = \'post\'
AND (wp_posts.post_status = \'publish\'
OR wp_posts.post_status = \'private\')
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 4

And it takes 1,4628 seconds.

我的问题是,如果我在phpmyadmin中放置相同的查询并更改此行,为什么会这样:

AND ( wp_term_relationships.term_taxonomy_id IN (8,9,10,11,12,13,14,15) )
进入

AND ( wp_term_relationships.term_taxonomy_id IN (8) )
The query becomes TWICE as fast (0.5077 seconds). 为什么它只搜索“8”-类别id,却搜索其他分类id?欢迎提供任何建议。

非常感谢。

1 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

正如@milo在评论中所说cat 参数(以及其他层次分类法中的类似参数)也将使查询在子类别中查找。如果不希望发生这种情况,请使用category__in 参数

至于一般的慢度,很难猜测,但这取决于您的DB服务器性能(可能是在恒定负载下,是时候升级了)以及表中这些帖子的“深度”。

最后但并非最不重要的一点是,如果您不需要超出限制的匹配结果数量的信息,您应该尝试添加\'no_found_rows\' => true 到您的查询。这样,DB将不会试图计算该类别中的总职位数量(SQL_CALC_FOUND_ROWS 查询的一部分)

结束