get_option()是否比访问get_transient()更快?


8

今天,我对数据库进行了测试,以探讨从选项,自定义表和瞬态访问键之间的速度差异。我运行了1000次测试,以下是运行1000次get操作所花费的时间:

  1. get_transient() 0.0245秒
  2. get_option() 0.0068秒
  3. 自定义表中的简单选择操作0.65秒

我还检查了此测试过程中瞬态未过期。所以问题是,get_option()get_transient()我测试中的速度快还是弄乱了?自定义表格是否由于WordPress默认缓存的选项而延迟?另外,选项是否也由瞬态等不同的缓存插件缓存?


答案是可变的,请记住,使用对象缓存,瞬态根本不会使用选项。无论如何,这都是微观优化,是浪费时间。自动加载作为一种选择,只会将成本转移到其他地方
Tom J Nowell

Answers:


15

今天,我对数据库进行了测试,以探讨从选项,自定义表和瞬态访问键之间的速度差异。我运行了1000次测试,以下是运行1000次get操作所花费的时间:

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

get_transient()0.0245秒get_option()0.0068秒来自自定义表的简单选择操作0.65秒

这也是一个不公平的比较,带有autoload选项集的选项将在早期的单个查询中提前加载。所以get_optionWP_Cache,该选项已被检索。

TLDR:它实际上不是在获取选项,它已经被获取,只是由于该autoload选项而将其从内存中拉出

我还检查了此测试过程中瞬态未过期。

这毕竟不会影响正常系统的瞬时检索,毕竟它直到被检索之前才知道它是否过期。

所以问题是,get_option()比get_transient()更快还是我在测试中弄乱了某些东西?

这取决于:

  • 在大多数系统上,瞬态是使用选项存储的,它们都涉及一个get_option调用
  • autoload设置为true的选项会在开始时全部加载到单个调用中,因此它们会保留在内存中,此后不会发生任何查询
  • 对象缓存同时缓存自动加载的选项和瞬态

自定义表格是否由于WordPress默认缓存的选项而延迟?

很有可能,但是选择需要花多长时间取决于查询和表设计

另外,选项是否也由瞬态等不同的缓存插件缓存?

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

重复性

这些都是通过缓存的,WP_Cache因此在您第二次请求时,不涉及数据库。

可变性及其取决于

所有这些都假设有共同的基础,但是对象缓存又如何呢?

让我们介绍一个MemcacheD实例或Redis实例(如果可以选择的话,我强烈建议您这样做,对于精心构建的网站,尤其是如果将它们用于页面缓存,除非使用类似Varnish的东西,否则,它们可以极大地提高性能)

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

  • 现在,数据存储在RAM中,并且一旦从数据库中获取了数据,便会对其进行初始化,从而大大减少了访问时间。仍比变量慢,但比数据库查询快得多
  • WP_Cache通常不会存储很多新数据。例如WP_Post对象,发布元等
  • WP_Cache 现在在请求之间仍然存在
  • MemcacheD等可以消除过期的瞬变等

因此,现在瞬态和选项具有相同的访问成本。它们已经关闭,但是现在可以忽略不计了,它们与发出请求时的CPU负载有更多关系。

因此,为了提高性能,我应该使用瞬态还是选项?

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

它不是那么简单

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

  • 如果您需要存储整个站点的内容,请使用选项
  • 使用瞬态来临时存储计算成本高的事物,因此您无需下次

您不值得花时间根据性能选择一个,而没有有意义的区别。

有很多要做的优化工作,可以大大节省开支,例如在后查询中使用分类法而不是元数据,不使用__not样式参数,在页面上执行更少的操作,安装对象缓存,每页上的帖子更少,避免远程请求等等

定制表会如何...

不,选项表已经过优化,使用自定义表会将操作简单地移到WP Caching系统之外,从而迫使您编写自己的表


关于,在我的情况下,它是自动加载的选项。定制表仅包含两行和一个选择查询以获取数据。
learning_13

我正在为我的插件执行此操作,并且必须在其中任何一个之间进行选择。根据我的设计,自定义表最容易实现,但是获取成本足够大,这会延迟页面加载。
learning_13

2
@ learning_13,您问的是错误的问题,也许tom和我都未能在我们的答案中传达此信息-适当的缓存将使您决定为关注性能的站点使用足够的性能。关于如何存储数据的决定应基于插件的结构及其功能和性能来决定。
马克·卡普伦

2
@ aim100k,请不要在此处回答“父母”。除非与答案或问题相关,否则不应提起人们为自己的生活做什么。如果您不喜欢答案,请投下反对票。如果您认为答案在技术上可能不错但令人反感,则可以尝试对其进行编辑,标记或在meta网站上进行讨论。
马克·卡普伦

@ mark-kaplun,假设我将数据存储在自定义表中,并在涉及插件的每次后期渲染中从中获取数据以显示一些数据。那么,缓存插件或用户的缓存优化是否会照顾该表的缓存?在实现和设计上的其他工作是否会发生变化,仅使用瞬态/选项,而不是使用更适合我的设计的自定义表,从而对页面加载速度进行微(过早)优化?
learning_13

4

如果没有找到对象缓存,则get_transient调用get_option两次,一次或终止时间间隔,并调用该值,因此不会更快。

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

当您直接访问数据库时,您将绕过所有缓存和其他性能改进,并且除非您自己实现一些智能逻辑,否则预期它会变慢。

话虽这么说,我不确定您的测试是否是一个很好的测试,但是无论如何,整个讨论毫无意义,好像您真的在乎性能一样,您将使用对象缓存系统(和相关的插件),这将使数据访问时间更加接近到零...。当然,如果您决定使用自己的数据库表,则应将访问API与对象缓存机制集成在一起。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.