Rails 5 - 首先是vs限制1 vs find

时间:2016-12-07 13:32:33

标签: ruby-on-rails benchmarking ruby-on-rails-5

使用Benchmark ips我做了这个测试。如果我刚刚测试的错误,请纠正我。请注意,96是我的数据库中第一个用户的ID。

Benchmark.ips do |x|
  x.report("first") do
    User.first
  end
  x.report("where") do
    User.where(id: 96).limit(1)
  end
  x.report("find") do
    User.find(96)
  end
  x.compare!
end

我多次运行此测试并将其作为结果

Comparison:
               where:    26430.8 i/s
               first:      999.8 i/s - 26.44x  slower
                find:      964.3 i/s - 27.41x  slower

我对此的总结是始终使用where而不是find或first,因为这些是获取特定用户的慢得多的方法。

Rails 5.0.0.1,PostgreSQL 9.5.3,Ruby 2.3.1

1 个答案:

答案 0 :(得分:2)

正如迈克尔·钱尼在评论中指出的那样

User.where(id: 96).limit(1)

不执行查询,它只构建一个ActiveRecord_Relation,只有在您尝试访问与之相关的用户记录时才会执行。{/ p>

这就是为什么您可以在几行上构建查询,而且性能影响最小

  @users = User.where(type: 'admin')
  @users = @users.where(status: 'enabled')

只有当您遍历@users时才会执行where子句"type = 'admin AND status = 'enabled'"的查询。

再次尝试基准,但(正如迈克尔建议的那样)将关系更改为将执行查询的数组。

User.where(id: 96).limit(1).to_a