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