更快地找到上次更新的时间戳

时间:2015-07-27 15:17:39

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord

我希望这个电话

Model.maximum(:updated_at)

要快于这个

Model.order(:updated_at).last.updated_at

有人能证实这个断言吗?如果是真的,解释原因?

2 个答案:

答案 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列的所有值,这会消耗更多内存(因为您必须构建一个大数组),并且需要更多时间