在使用SQL_CALC_FOUND_ROWS的WordPress管理部分中,我们的查询性能非常慢。
我们目前在我们的站点上有大约125,000篇文章,并且使用Varnish缓存前端,并且在WordPress版本4.2.3上。
当有人使用WordPress的管理部分时会出现问题,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筛选器?
我计划删除一些post版本并进行一些DB优化,但首先想知道在WordPress中是否存在某种修复方法。
我在寻找这个问题时遇到过类似的问题,但大多数问题似乎都有2-6年的历史了。
发布于 2017-06-22 19:13:43
SQL_CALC_FOUND_ROWS的使用并不是一个真正的问题,尽管它会带来一些开销。
所发生的情况是,WordPress使用SQL_CALC_FOUND_ROWS来确定如果没有提供LIMIT子句将返回的总帖子。这是必要的,以计算和提供正确的分页链接。
无条件地禁用它是保证破坏整个地方的东西。
如果您可以识别使用它的特定查询,并且不需要分页,那么您可以将pre_get_posts挂钩并有条件地将no_found_rows参数设置为true。然而,这与其说是一种解决方案,不如说是一种黑客行为。
正确的解决方案是在数据库端使用数据库查询缓存机制,或者在WordPress端使用高级后缓存 (为WordPress.com开发和使用)等插件。
发布于 2017-02-23 14:09:04
$query->set(‘no_found_row’,true);
https://wordpress.stackexchange.com/questions/201728
复制相似问题