慢速SQL_CALC_FOUND_ROWS查询

时间:2015-09-04 作者:bigmike7801

使用SQL_CALC_FOUND_ROWS 在WordPress的管理部分。

我们目前在我们的网站上有大约125000篇帖子,使用Varnish缓存前端,并使用WordPress版本4.2.3。

当有人使用WordPress的admin部分时,问题就会出现,WordPress将运行如下查询:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
WHERE 1=1 AND (((wp_posts.post_title LIKE \'%denali%\') 
OR (wp_posts.post_content LIKE \'%denali%\'))) 
AND wp_posts.post_type = \'post\' 
AND (wp_posts.post_status = \'publish\' 
OR wp_posts.post_status = \'future\' 
OR wp_posts.post_status = \'draft\' 
OR wp_posts.post_status = \'pending\' 
OR wp_posts.post_status = \'private\') 
ORDER BY wp_posts.post_title LIKE \'%denali%\' DESC, 
wp_posts.post_date DESC LIMIT 0, 20 
是否有修补程序来修复此问题或某种pre_get_posts 我可以运行的筛选器?

我计划删除一些后期修订并进行一些DB优化,但首先想看看WordPress中是否有对此的某种修复。

我在搜索时也遇到过类似的问题,但大多数问题似乎都是2-6年前的问题。

2 个回复
SO网友:Anastis

使用SQL_CALC_FOUND_ROWS 这不是一个真正的问题,尽管它会带来开销。

WordPress使用SQL_CALC_FOUND_ROWS 为了确定如果没有返回的员额总数LIMIT 提供了第条。为了计算并为您提供正确的分页链接,这是必要的。

无条件禁用它肯定会破坏所有东西。

如果您可以识别因其使用而受到影响的特定查询,并且可以不分页,那么您可以连接到pre_get_posts 并有条件地设置no_found_rows 参数设置为true。然而,这与其说是一种解决方案,不如说是一种黑客行为。

正确的解决方案是使用数据库查询缓存机制,或者在数据库一侧,或者在WordPress一侧使用插件,例如Advanced Post Cache (为WordPress.com开发并使用)

SO网友:Younes Nesta

$查询->设置(\'no\\u found\\u rows\',true);