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