我有许多全局应用程序设置,这些设置存储在DB中名为“settings”的表中。它有三列:id,key,value。
现在假设我有一个产品列表,其中列出了30个产品。显示这些产品中的每一个都需要从设置表中检索某个设置“汇率”。我这样做的方法是向应用程序帮助程序添加一个函数“exchange_rate”,它使用键“exchange rate”查找设置行并检索该值。
你可能会问,现在怎么了?好吧,没什么,它工作得很好,但当我按照开发服务器日志时,我注意到每个请求有30个这样的条目:
CACHE(0.0ms)SELECT settings
。* FROM settings
WHERE(settings
。key
='exchange_rate')LIMIT 1
CACHE(0.0ms)SELECT settings
。* FROM settings
WHERE(settings
。key
='exchange_rate')LIMIT 1
它看起来很丑陋,我的日志变得杂乱无章。原因很明显:DB条目被检索30次。它似乎没有任何数据库负载,因为它说CACHE,所以不应该有任何性能问题(或者有吗?我不知道)。
我的问题是:检索此全局变量(汇率)ONCE然后将其保存在某处(其中?)是否“更干净”更合理,这样我就不会看到这些看似多余的(虽然是缓存的)数据库请求?
答案 0 :(得分:3)
是的,解决这个问题的最佳方法是将值存储在类变量中。例如:
class Settings
def self.exchange_rate
@@exchange_rage ||= (execute your SQL query and get the result here)
end
end
这样,只要你调用Settings.exchange_rate,你就只会在第一次执行查询。其余的时间将使用@@ exchange_rate类变量。
在您的原始示例中,唯一的性能影响是SQL查询的生成和缓存的命中,因此它肯定存在,但并不像每次您想要汇率时实际访问数据库那么糟糕。 / p>