我有一个Rails 4.2应用程序,其中有数百个这样的调用:
CACHE (0.0ms) SELECT "albums".* FROM "albums" WHERE (albumable_type='ItemProfile' and albumable_id=33333) ORDER BY "albums"."id" ASC LIMIT 1
CACHE (0.0ms) SELECT COUNT(*) FROM "assets" WHERE "assets"."album_id" = $1 AND "assets"."is_enabled" = $2 [["album_id", 19182], ["is_enabled", true]]
CACHE (0.0ms) SELECT "albums".* FROM "albums" WHERE (albumable_type='ItemProfile' and albumable_id=33333) ORDER BY "albums"."id" ASC LIMIT 1
CACHE (0.0ms) SELECT "assets".* FROM "assets" WHERE "assets"."album_id" = $1 AND "assets"."is_enabled" = $2 ORDER BY "assets"."position" ASC LIMIT 1 [["album_id", 19182], ["is_enabled", true]]
两个问题:
所以问题是有以下内容:
def instore_image
album.enabled_assets.first
end
和
def image_600w
Rails.logger.info("#9797 here is instore_image_url")
instore_image.asset.url(:fixed_width600)
Rails.logger.info("#9898 here is instore_image_url")
end
image_600w正在调用一轮sql调用(无论是否缓存)。似乎要防止这种情况发生我需要在对象上设置一个实例变量。
答案 0 :(得分:1)
您应该查看Rails指南中的Caching with Rails部分:
1.5 SQL缓存
查询缓存是一种Rails功能,用于缓存返回的结果集 通过每个查询,以便如果Rails再次遇到相同的查询 该请求,它将使用缓存的结果集而不是运行 再次查询数据库。
因此,这些查询实际上是由您的应用程序进行的,但ActiveRecord会拦截这些查询并通过直接从查询缓存传递来阻止SQL查询。
有没有办法告诉Rails它已经有这个信息并且不需要检查它?像数百次似乎在我的最后是一个错误。
是的,Rails已经通过重用缓存的查询结果尽力而为。您可以使用bullet在应用程序中识别N + 1个查询和其他类似的低效数据库使用模式。