解决 10w+ 数据 WordPress SQL_CALC_FOUND_ROWS 查询使网站变慢问题

WordPress 在查询 post 列表时,默认会同时把文章数量也查询出来,使用这种方式的有:get_posts 、query_posts 和 WP_Query。

文章转自:歪麦博客

SQL_CALC_FOUND_ROWS 查询简介

get_posts 在 4.6.1+ 已经不用 SQL_CALC_FOUND_ROWS,但是 query_posts 和 WP_Query 还是会用,所以还须优化。

具体语句如下:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' ) ORDER BY wp_posts.post_date DESC LIMIT 0, 20
SELECT FOUND_ROWS()

这在网站数据量小的时候,不会引起什么问题,但是当 post 数量到 10w+ 时,这个就是一条必现的慢查询,首页、分类、标签、搜索页面,只要用到这几个函数,就都会使用 SQL_CALC_FOUND_ROWS 这个方式。

如何解决 10w+ 数据 WordPress SQL_CALC_FOUND_ROWS 查询使网站变慢问题?

禁用 SQL_CALC_FOUND_ROWS,用一种更加高效的方式。这里我们用 EXPLAIN 方式,为什么用 EXPLAIN 而不是 count(*) ?

具体代码如下,放在主题 functions.php 文件即可:

if ( ! function_exists( 'theme_set_no_found_rows' ) ) {
/**
* 设置WP_Query的 'no_found_rows' 属性为true,禁用 SQL_CALC_FOUND_ROWS
*
* @param WP_Query $wp_query WP_Query 实例
* @return void
*/
function theme_set_no_found_rows(\WP_Query $wp_query)
{
$wp_query->set('no_found_rows', true);
}
}
add_filter( 'pre_get_posts', 'theme_set_no_found_rows', 10, 1 );


if ( ! function_exists( 'theme_set_found_posts' ) ) {
//使用 EXPLAIN 方式重构
function theme_set_found_posts($clauses, \WP_Query $wp_query)
{
// Don't proceed if it's a singular page.
if ($wp_query->is_singular()) {
return $clauses;
}

global $wpdb;

$where = isset($clauses['where']) ? $clauses['where'] : '';
$join = isset($clauses['join']) ? $clauses['join'] : '';
$distinct = isset($clauses['distinct']) ? $clauses['distinct'] : '';

$wp_query->found_posts = (int)$wpdb->get_row("EXPLAIN SELECT $distinct * FROM {$wpdb->posts} $join WHERE 1=1 $where")->rows;

$posts_per_page = (!empty($wp_query->query_vars['posts_per_page']) ? absint($wp_query->query_vars['posts_per_page']) : absint(get_option('posts_per_page')));

$wp_query->max_num_pages = ceil($wp_query->found_posts / $posts_per_page);

return $clauses;
}
}
add_filter( 'posts_clauses', 'theme_set_found_posts', 10, 2 );

参考资料

WordPress: SQL_CALC_FOUND_ROWS, why it’s slow and what to do about it

Speed up WordPress WP_Query and query_posts functions

参考资料备份下载:城通网盘

除非注明,垃圾站文章均为网络收集,本文地址 https://cyhour.com/120/,转载时烦请以链接形式注明原始出处。
声明:我们不销售主机,任何VPS主机均有跑路风险且需定期备份,防止数据丢失。信息以实际为准,评测仅供参考不代表权威!
🍄:Netflix 奈飞 YouTube 合租

升级新版 Google AdSense 代码提升广告效果

2021年7月19日,Google AdSense 最近发布了新版 AdSense 代码。通过新版 AdSense 代码,AdSense 可以更早触发优化功能,从而提升网站上广告效果。新广告代码适用于自动广告和广告单元。 如何获取 Google AdSense 新版代码? 无需采取任何措施。在下次登录 AdSense 后,您将拥有对新广告代码的访…

利用 Google Analytics 追踪 WordPress 站内搜索关键词

Google分析(Google Analytics)是一个由 Google 所提供的网站流量统计服务。Google 分析(Analytics)现在是互联网上使用最广泛的网络分析服务。 利用 Google Analytics 追踪 WordPress 站内搜索关键词 优化内容 如果网站/博客在 Google Analytics 流量统计,利用 Google Analytics 追踪 W…

Google Analytics 异步请求(服务端请求)

感谢伟大的祖国,使得好好的 Google,必须折腾一番才能好好的用起来。Google 搜索如此,Google Analytics 肯定也不例外(网上据说 Google Analytics 没有被屏蔽)。 Google Analytics 支持服务端发送统计信息(via:Jerry Qu),而通过服务端统计可以解决 Google Analytics 连接缓慢问题,提高页面…
浏览: 65 标签:  ,  , 

Gravatar 头像被墙及解决方案 Gravatar 头像国内镜像地址大全

Gravatar 头像真是一言难尽,时而正常时而抽风时而无法访问……就一个 Gravatar 头像,这有啥好强(现代通假字)的呢?(据说是被其它服务连累?) 解决办法 - 调用 ssl/cn 头像链接 历史解决办法:调用 ssl 头像链接——https还是没被墙的,而且速度还不错,直接调用这个最简单了。主题 functi…

Comments:0

发表留言

Vultr 送$100,搬瓦工年付最低$49,优惠码 BWH3HYATVBJW,更多推荐VPS信息