GET_OPTION()比访问GET_TRANSPORT()快吗?

时间:2018-02-12 作者:learning_13

今天,我在db上运行了一个测试,以探索从选项、自定义表和;瞬态。我运行了1000次测试,下面是运行1000次get操作所需的时间:

  1. get_transient() 0.0245秒get_option() 0.0068秒
  2. 从自定义表格中进行简单选择操作0.65秒
我还检查了瞬态在该测试期间是否未过期。所以问题是get_option() 快于get_transient() 还是我在考试中搞砸了什么?WordPress是否默认缓存选项导致自定义表延迟?此外,选项是否也由不同的缓存插件(如transients)缓存?

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

今天,我在db上运行了一个测试,以探索从选项、自定义表和;瞬态。我运行了1000次测试,下面是运行1000次get操作所需的时间:

请记住,选项表用于大多数系统的选项和瞬态,并且该表经过优化,添加了索引。所以这不是一个公平的比较

get\\u transient()0.0245秒get\\u option()0.0068秒从自定义表中简单选择操作0.65秒

这也是一种不公平的比较autoload 选项集将在早期的单个查询中加载到advanced中。所以get_option 正在从WP_Cache, 已检索到该选项。

TLDR:它实际上并没有获取选项,它已经被获取了,它只是从内存中提取它,因为autoload 选项

我还检查了瞬态在测试期间是否未过期。

这不应该对正常系统的瞬态检索产生影响,毕竟在检索之前它不知道是否过期。

所以问题是,get\\u option()比get\\u transient()快还是我在测试中弄糟了什么?

这取决于:

在大多数系统中,瞬态是使用选项存储的,这两种选项都涉及get_option 使用调用选项autoload 如果设置为true,则在一次调用开始时都会加载,因此它们会保留在内存中,此后不会发生任何查询。对象缓存会缓存两个自动加载的选项,而瞬态缓存是由于WordPress缓存选项而导致的自定义表延迟吗?

很有可能,但选择的速度很大程度上取决于查询和表设计

此外,选项是否也由不同的缓存插件(如transients)缓存?

WP_Cache 将其存储在内存中以供其余请求使用。出于性能原因,缓存插件可能会保留这些值。

重复性这些都是通过WP_Cache 因此,当您第二次请求时,不涉及DB。

可变性及其依赖性这一切都假设了一个共同的基础,but what about object caches?

让我们介绍一个MemcacheD实例或Redis实例(如果您有选择的话,我强烈建议您这样做,这对构建良好的站点有巨大的性能好处,特别是如果您将它们用于页面缓存,除非您有类似Varnish的设置)

现在我们有了一个新情况:

现在,数据存储在RAM中,一旦从DB中取出,它就会启动,访问时间大大减少。仍然比变量慢,但比数据库查询快得多许多新数据存储在WP_Cache 这通常不是。例如。WP_Post 对象、post meta等WP_Cache 现在跨请求持久化,MemcacheD etc可以消除过期的瞬态etc,因此现在瞬态和选项具有相同的访问成本。它们已经很接近了,但现在可以忽略不计,更多的是与发出请求时的CPU负载有关。

那么对于性能,我应该使用瞬态还是选项

虽然这是一个值得怀疑的问题,但答案是差异可以忽略不计,并且在误差范围内

its not that simple

因此,停止微优化,它们是相同的存储介质,这不值得你花时间

如果您需要存储站点范围内的内容,请使用选项使用瞬态来临时存储计算成本高昂的内容,这样您就不必等到下一次了。根据性能来选择其中一个是不值得的,没有什么显著的区别。

有更好的方法可以进行优化,从而大大节省成本,例如在post查询中使用分类法而不是元,而不是使用__not 样式参数、在页面上执行更少的操作、安装对象缓存、降低每页的帖子数量、避免远程请求等

那么一个自定义表将

否,选项表已经得到了很好的优化,使用自定义表只需将操作移到WP缓存系统之外,迫使您自己编写

SO网友:Mark Kaplun

如果找不到对象缓存,get_transient 呼叫get_option 两次、一次或到期时间间隔和一个值,因此不会更快。

get_option 性能本身将受到选项是否为“自动加载”(默认)的影响。所有自动加载的选项都会在一个DB请求中检索并存储在内存缓存中,因此对调用次数的影响应该很小get_option 即使是针对不同的选项。

当您直接访问DB时,会绕过所有缓存和其他性能改进,除非您自己实现一些智能逻辑,否则它的速度可能会较慢。

尽管如此,我不确定您的测试是否良好,但无论如何,整个讨论都是毫无意义的,因为如果您真的关心性能,那么您将使用对象缓存系统(和相关插件),这将使数据访问时间更接近于零。。。。当然,如果您决定使用自己的DB表,那么应该将access API与对象缓存机制集成在一起。

结束