WordPress 6.1 中对 WP_Query 性能的改进

在数据库查询中添加缓存WP_Query

WordPress 6.1 包括对如何在WP_Query类中执行数据库查询的改进,导致数据库查询将被缓存。这意味着如果多次运行同一个数据库查询,结果将从缓存中加载。对于那些使用持久对象缓存的人来说,这意味着数据库查询在缓存失效之前不会再次运行,从而导致对数据库的查询要少得多。使用内存缓存的站点也将看到不重复这些查询的好处,尽管性能改进不会那么显着。 

对于那些进行自定义开发的人,请确保您正在使用核心功能,例如wp_insert_post将帖子添加到数据库。这些函数维护得很好,通过使用它们,您可以确保缓存正确无效。如果您是直接更新数据库,那么强烈建议您clean_post_cache在更新数据库行后调用该函数。 

值得注意的是,默认情况下,所有调用都WP_Query将被缓存。cache_results只需将参数传递为 ,就可以选择退出缓存查询false。参见示例:

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

也可以使用过滤器全局禁用缓存:

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

像这样禁用缓存应该只在极端情况下进行。为了获得最佳性能,强烈建议使用该功能保持启用缓存并使缓存无效clean_post_cache。 

WP_Query缓存键是使用传递给类实例的参数生成的。但是,以下参数将被忽略:

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

这些参数不会影响正在运行的数据库查询。最重要的忽略参数是fields。这意味着如果您运行以下命令: 

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


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

在这两种情况下,查询现在都将请求所有字段,以便可以缓存结果,然后无论fields参数如何都可以使用。在此更改之前,这两者的数据库查询是不同的,但保持这种状态会导致多个缓存有效地用于相同数据的子集。这意味着现在限制fieldsid 时的性能改进不如以前版本的 WordPress。 

此更改还意味着始终尊重update_post_meta_cacheupdate_post_term_cache缓存。 

如果WP_Query使用诸如advanced-post-cacheEnhanced Post CacheCache WP_Query之类的插件添加了缓存,则建议禁用并删除这些插件,因为它们不再需要。

有关详细信息,请参阅Trac 票证 #22176

主要用户缓存WP_Query

WordPress 6.1 引入了一个新功能,update_post_author_caches. 在 6.1 之前,具有多个作者的站点需要几个单一的数据库查询来获取作者信息,因为用户是作为循环的一部分加载的。现在,用户(作者)缓存不是一个一个地加载每个用户,而是通过在循环开始时调用而在单个数据库调用中准备update_post_author_caches好,从而减少了数据库查询。 

此函数接受一个帖子对象数组,并将初始化用户缓存。update_post_author_caches代码库的关键部分也添加了调用以提高数据库性能。

有关详细信息,请参阅 Trac 票证#55716

菜单项的主要链接对象

核心中添加了一个新功能,称为update_menu_item_cache. 它接受一个帖子对象数组,并为菜单项中引用的帖子或术语提供缓存。WP_Query添加了一个名为的新参数update_menu_item_cache。当设置为true它时,它将调用update_menu_item_cache这将允许您在两个数据库查询中初始化菜单项(一个用于帖子,一个用于术语)。 

有关详细信息,请参阅 Trac 票证#55620

get_page_by_title现在使用WP_Query

该函数get_page_by_title现在使用WP_Query. 以前,此函数使用原始数据库查询按标题获取页面。如上所述,WP_Query现在已缓存,这意味着对的调用get_page_by_title也将被缓存。这还具有运行WP_Query

有关详细信息,请参阅 Trac 票证#36905

感谢 @ flixos90 、  @ milana_cap 、  @ peterwilsoncc 同行评审@shetheliving校对

订阅评论
提醒
guest的头像

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x