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()的逻辑是:- 先检查对象缓存里有没有这个transient;
- 没有的话,先查
_transient_timeout_xxx键看是否过期; - 确认没过期后,再查
_transient_xxx键拿值; - 最后把结果存入对象缓存。
看到没?默认情况下,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
相关产品推荐
相关产品推荐

