Rails 5 - first vs where limit 1 vs find

Rails 5 - first vs where limit 1 vs find

使用 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

正如 Michael Chaney 在评论中指出的那样,

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

不执行查询,它只是构建一个 ActiveRecord_Relation,它仅在您尝试访问它相关的用户记录时执行。

这就是为什么您可以在多行上构建查询而性能影响最小的原因

  @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