WordPress数据库优化从此再见!(WordPress官方集成WP_Query的SQL 查询缓存)

文 / @UTHEME

为什么要和WordPress数据库优化说再见

WordPress因为本身是一款为博客设计的程序,在文章数量增多以后,数据库体积会指数级直线扩大。这时如果你依然要求你的网站有十分优秀的打开速度和访问体验,那肯定就离不了用Redis或Memcached 来对高频的数据库查询做一下缓存。

然而WordPress 在6.1 的版本更新中,改进了 WP_Query 类中数据库查询的执行方式,实现 SQL 查询缓存,如果多次运行同一条 SQL 查询,查询结果将从缓存中加载。这意味着对于使用持久对象缓存服务(比如 Memcached)的站点来说,在缓存失效之前,相同的数据库查询就不会再次运行。

这次从而显著降低站点的数据库查询次数,从而真正实现了站点的 0SQL。看来在6.1版本以后,WordPress官方已经集成了WP_Query的SQL 查询数据缓存,我们可以彻底和WordPress数据库优化的那些插件说再见了!

如何禁用WP_Query缓存

值得注意的是,在默认情况下,WP_Query 的所有数据库查询都将被缓存,如果想不缓存,只需在传入WP_Query参数数组的时候,将 cache_results 参数设置为 false 即可:

$query = new WP_Query(array(
   'posts_per_page' => 50,
   'cache_results'  => false
));

也可以通过 filter 全局禁用缓存:

add_action('parse_query', function($wp_query){
   $wp_query->query_vars['cache_results'] = false;
});

为了获得最佳性能,UTHEME强烈建议您保持WP_Query缓存开启,如果清理缓存使用 clean_post_cache 函数,非一些极端情况下不要禁用WP_Query缓存。

缓存 key 规则

缓存的键是使用 WP_Query 的查询参数生成的,但是会忽略以下参数:

  • suppress_filters
  • cache_results
  • fields
  • update_post_meta_cache
  • update_post_term_cache
  • update_menu_item_cache
  • lazy_load_term_meta

因为这些忽略的参数不会影响生成的 SQL 语句,其中特别要注意下 fields 参数:

$query2 = new WP_Query(array(
    'posts_per_page' => 50,
    'fields'  => 'ids'
));

$query3 = new WP_Query(array(
    'posts_per_page' => 50,
    'fields'  => 'all'
));

上面这两种情况,无论是否使用了 fields 参数或者什么参数,生成的 SQL语句都是一样的,然后查询结果都会被缓存起来,这样就能够更加高效的使用缓存,而无需存储多份缓存数据。

相信WordPress6.1版本正式发售以后,WordPress的主题、插件开发作者都会及时跟进,第一时间集成WP_Query的SQL 查询缓存功能。让大家卸载那些WordPress数据库优化插件。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。