You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

get_option()是否比get_transient()更快?测试结果存疑求解

关于get_option()与get_transient()读取速度差异的分析

嘿,这个测试结果挺值得深究的,咱们来一步步理清楚到底是怎么回事~

首先,得先搞懂这两个函数的底层逻辑,这是理解速度差异的核心:

1. 默认配置下的底层实现差异

  • get_option():它的逻辑很直接——先检查WordPress的对象缓存(默认是请求内的内存缓存),如果缓存里有直接返回;没有的话就去wp_options表查对应键,然后把结果存入对象缓存,后续请求直接用缓存。整个过程在第一次查询后,后续都是内存级别的读取,速度极快。
  • get_transient():如果你的WordPress没配置外部缓存(比如Redis、Memcached),transient其实也是存在wp_options表里的,只不过分成了两个键:_transient_{你的键名}存值,_transient_timeout_{你的键名}存过期时间。所以get_transient()的逻辑是:
    1. 先检查对象缓存里有没有这个transient;
    2. 没有的话,先查_transient_timeout_xxx键看是否过期;
    3. 确认没过期后,再查_transient_xxx键拿值;
    4. 最后把结果存入对象缓存。

看到没?默认情况下,get_transient()比get_option()多了过期检查这一步逻辑,第一次查询时甚至会多一次数据库查询(查timeout键),所以它的耗时比get_option()高是完全合理的。

2. 你的测试是否存在问题?

虽然结果合理,但也可以从这几个维度验证测试的准确性:

  • 缓存预热:如果你的测试代码是直接循环1000次,第一次调用是数据库查询,后面999次是内存缓存。可以试试在循环前先调用一次get_option()和get_transient(),让它们先存入对象缓存,再执行循环测试,看看两者的耗时会不会更接近(但transient还是会因为过期检查的逻辑略慢一点)。
  • 外部缓存配置:检查你的WordPress是否配置了外部对象缓存(比如用了Memcached插件)。如果配置了,transient会存在内存缓存里,这时候get_transient()应该比get_option()快(因为get_option()默认不会自动存入外部缓存,除非你手动配置)。但从你的测试结果看,应该是没配外部缓存的情况。
  • 数据库查询日志:开启WP_DEBUG_LOG,查看测试期间的数据库查询记录,你会发现get_transient()确实比get_option()多了一条查询timeout键的SQL语句,这就是额外耗时的来源。

总结

你的测试结果是合理的——在WordPress默认配置(无外部缓存)下,get_option()确实会比get_transient()更快,因为后者多了过期检查的额外逻辑。如果后续配置了外部对象缓存,transient的读取速度会反超get_option(),这时候两者的性能差异就会反转啦。

内容的提问来源于stack exchange,提问作者learning_13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:54:30