2016-12-07 57 views
0

使用Benchmark ips我做了这个测试。如果我在刚刚测试过的地方出错,请纠正我。请注意,96是我的数据库中第一个用户的ID。Rails 5 - 第一vs哪里限制1 vs发现

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 

我的这个conclussion是始终使用那里,而不是寻找或第一,因为这些都是慢得多的方式来获取特定用户。

Rails的5.0.0.1和PostgreSQL 9.5.3,2.3.1红宝石

+3

您并未实际运行“where”查询。可能如果你在它的末尾添加一个'.to_a',它实际上会运行。 –

回答

1

正如迈克尔·钱尼指出,在评论中,行

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 
+0

ahhh。现在的数字是否更准确=) 比较: 第一个:986.6 i/s 发现:940.7我/ s - 同一ish:差异在误差范围内 其中:931.6 i/s - same-ish:差异属于错误 – Philip