我希望这个电话
Model.maximum(:updated_at)
要快于这个
Model.order(:updated_at).last.updated_at
有人能证实这个断言吗?如果是真的,解释原因?
答案 0 :(得分:3)
您可以使用the Benchmark module轻松调查,例如:
takeNat, dropNat :: Nat -> [a] -> [a]
使用n>值得这样做1您必须清除可能涉及的各种缓存。您的数据库服务器中可能存在缓存,与ActiveRecord缓存分开。例如,清除可以调用的Mysql缓存:
require 'benchmark'
n = 50000
Benchmark.bm do |x|
x.report('maximum') { n.times.do; v1; end }
x.report('order-pluck') { n.times do; v2; end }
end
def v1
clear_cache
Model.maximum(:updated_at)
end
def v2
clear_cache
Model.order(:updated_at).pluck(:updated_at).last
end
def clear_cache
ActiveRecord::Base.connection.query_cache.clear
end
答案 1 :(得分:0)
您的期望是正确的。
当您致电Model.maximum(:updated_at)
时,您要求您的数据库只返回一个值。
当您调用Model.order(:updated_at).pluck(:updated_at).last
时,您的数据库会返回表中updated_at
列的所有值,这会消耗更多内存(因为您必须构建一个大数组),并且需要更多时间