WordPress尝试尽可能减少数据库查询的数量。
例如,在查询数据库之前,每当您获得一个元字段或分类字段时,WordPress都会查看该字段是否已被查询并存储在缓存中,然后从那里返回它,而不是查询数据库。
“缓存作业”通过WP_Object_Cache
class and wp_cache_*
functions (它们是该类方法的包装器。)
默认情况下,“cache”只不过是一个PHP全局变量。这意味着它在内存中,但也意味着它在每次请求时都会消失。
但是,通过dropins(advanced-cache.php
和/或object-cache.php
), 可以设置一种自定义方式来处理此缓存。
通常,这个dropins用于设置某种缓存机制,以“生存”单个请求。
因此,在WP的人中,这些被称为“持久缓存”插件(即使在气泡之外,“缓存”和“持久”这两个词在一起也没有多大意义)。
现在流行的选择是Memcached 或Redis.
因此,使用“持久缓存”插件可以大大减少数据库查询的数量,因为缓存不会在每次请求时更新。
一些示例
$foo = get_post_meta(\'foo\', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta(\'bar\', $post_id, true);
上面的2行代码将最多触发1个数据库查询。
事实上,当您查询一个自定义字段时,该帖子的所有字段都是从数据库中检索出来的,通过对象缓存进行缓存,随后的请求从缓存而不是从数据库中提取数据。
分类法术语也会发生同样的情况,WordPress一次提取一个分类法的所有术语,然后从缓存中返回它们。
对象缓存在WordPress中使用非常广泛。不仅适用于帖子、元值和分类法,还适用于用户、评论、主题数据。。。
什么WP_Query
这一切都有关系吗
当您通过
WP_Query
, 默认情况下,WordPress不仅从数据库(或从缓存中提取,如果缓存了),而且
updates the cache for all custom fields and all taxonomies 与所拉岗位相关。
例如,当你打电话时,get_the_terms()
或get_post_meta()
在循环帖子时通过WP_Query
, 实际上,您不会触发任何数据库查询,而是从缓存中提取信息。
很好,不是吗嗯,是的,但这是有代价的。
WordPress在通过WP_Query
发生在update_meta_cache
对于meta和inupdate_object_term_cache
用于分类。
如果你看一下这些函数的源代码,你会发现WordPress在每个函数中只执行一个db查询,但也进行了大量处理。例如,在update_object_term_cache
有7 nested foreach
... 如果您有很多分类法,并且每页的帖子数量很高,那么这并不是很好。
关于那些WP_Query
参数,最后是什么\'update_post_meta_cache\'
和\'update_post_term_cache\'
设置为时执行false
是为了防止WordPress分别为自定义字段和分类更新缓存。
在这种情况下,第一次查询自定义字段或分类时,会触发数据库查询,并缓存数据。
值得这么麻烦吗
像往常一样,答案是
it depends. 大多数情况下,将这些值设置为
false
, 是一个不错的选择,因为它可以防止不必要的处理和数据库查询(如果不需要的话),而且缓存在第一次需要自定义字段/分类术语时都会更新。
然而,如果你要打电话,哪怕是一次,get_post_meta()
在循环过程中,您将调用get_the_terms()
对于POST支持的所有(或大多数)分类法,无论如何都会触发缓存更新,将这些查询参数设置为false
.