当前位置:蚂蚁分类目录 » 站长资讯 » 站长运营 » WordPress教程 » 文章详细 订阅RssFeed

WordPress博客程序文章多了之后网站变卡是什么原因?Wordpress数据库优化解决

来源:vps博客 浏览:1087次 时间:2021-07-22 21:08:16
大家有没有发现当使用WordPress这款程序文章多了后会越来越卡,如果不进行优化直接没法用。今天分享下WP之数据库SQL优化方法。

 

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

解决方案:

 

方法一

彻底禁用SQL_CALC_FOUND_ROWS

放在functions.php文件即可:

add_action('pre_get_posts', 'wndt_post_filter'); 
function wndt_post_filter($query){ if (is_admin() or !$query->is_main_query())
 { return $query; } // 禁止查询 SQL_CALC_FOUND_ROWS $query->set('no_found_rows', true); }

方法二

如果仍然需要查询文章数量,使用更加高效的EXPLAIN方式代替SQL_CALC_FOUND_ROWS

禁用掉SQL_CALC_FOUND_ROWS用法,用一种更加高效的方式,

这里我们用EXPLAIN方式

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

if ( ! function_exists( 'maizi_set_no_found_rows' ) ) { /**
     * 设置WP_Query的 'no_found_rows' 属性为true,禁用SQL_CALC_FOUND_ROWS
     *
     * @param WP_Query $wp_query WP_Query实例
     * @return void
     */ function maizi_set_no_found_rows(\WP_Query $wp_query)
{ $wp_query->set('no_found_rows', true); } } 
add_filter( 'pre_get_posts', 'maizi_set_no_found_rows', 10, 1 );
 if ( ! function_exists( 'maizi_set_found_posts' ) ) { /**
     * 使用 EXPLAIN 方式重构
     */ function maizi_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']