时间:2024-04-03
我是一名WordPress博主,最近在对博客进行优化,发现分页查询速度较慢,经过研究得出了以下两种优化方案,希望对于遇到相同问题的朋友有所帮助。
SQL_CALC_FOUND_ROWS MySQL查询在WordPress中用于获取查询结果总数量,这个查询的速度非常慢,加上WordPress不能缓存这个查询结果,当文章数量比较多的时候,WordPress的列表页打开速度会受到影响。
为了实现分页功能,WordPress在很多查询中都使用了SQL_CALC_FOUND_ROWSMySQL查询,即使我们根本不需要分页功能,SQL_CALC_FOUND_ROWS的功能是让MySQL计算在数据库中总共有多少条记录匹配查询的条件,如果匹配的记录非常多,这将是非常耗费时间的一件事情。
通过查看WordPress3.x的源码,我发现了一个没有写在参考文档里面参数:no_found_rows,这个参数接受的值为布尔值,它可以告诉query_posts和WP_Query不要计算总匹配数量,我们可以这样使用:
query_posts('no_found_rows=true&cat=1&numberposts=1');
这样,WordPress再查询文章的时候,就不会再进行不必要的总匹配记录数计算了,对提高WordPress页面速度和节能环保有帮助。
除了SQL_CALC_FOUND_ROWS查询,在MySQL中我们还可以使用COUNT(*)来获取总行数,经过对比,我们发现后者的速度比前者要快不少(有时候会快到10倍之多),我们可以使用COUNT(*)来代替SQL_CALC_FOUND_ROWS查询来获取总行数,这样既可以加快查询速度,又不会损失分页功能。
首先,我们使用pre_get_postsFilter钩子,直接在所有查询中设置no_found_rows禁用SQL_CALC_FOUND_ROWS查询。
add_filter('pre_get_posts',function(\WP_Query$wp_query) { $wp_query->set('no_found_rows',true); });
添加了以上代码,所有WordPress查询中的分页参数便缺失了,分页功能自然就失效了。我们需要使用posts_clauses钩子修改WordPress数据库查询,使用COUNT(*)查询来获取总行数,并设置分页所需要的参数。
add_filter('posts_clauses',function($clauses,\WP_Query$wp_query) { //跳过单页面 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']:''; //构造并运行查询,将查询结果设置为我们要运行主查询的“found_posts”参数。 $wp_query->found_posts=$wpdb->get_var("SELECT$distinctCOUNT(*)FROM{$wpdb->posts}$joinWHERE1=1$where"); //计算每页应该有多少文章。 $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'))); //设置max_num_pages参数 $wp_query->max_num_pages=ceil($wp_query->found_posts/$posts_per_page); //返回$clauses自查询,以便运行主查询 return$clauses; },10,2);
添加了以上代码之后,我们便把使用COUNT(*)查询替换SQL_CALC_FOUND_ROWS查询,如果您的WordPress文章总数比较多(千条以上),查询加速会比较明显。当然,如果平时使用的时候,并没有感觉到分页的打开速度慢,就不要多此一举添加上面的代码了,毕竟多一事不如少一事,如果没有问题,就不要进行优化。
Copyright © 2019-2024 wangzhan.shop