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']