2016-12-07 11 views
0

Benchmark ipsを使用してこのテストを行いました。私がちょうどテストしたものが間違っているなら、私を訂正してください。 96は私のdbの最初のユーザーのIDです。Rails 5 - 最初の制限と1の制限の比較

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、Rubyの2.3.1

+3

「場所」クエリは実際には実行されていません。おそらく '.to_a'をその末尾に追加すると実際に実行されます。 –

答えて

1

マイケル・チェイニーは、コメントで指摘するように、

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

行がクエリを実行しません、それだけで構築しますActiveRecord_Relationこれは関連するユーザーレコードにアクセスしようとすると実行されます。あなたはそれはあなたがそのwhere"type = 'admin AND status = 'enabled'"実行して、クエリ@usersを繰り返し処理する場合にのみだパフォーマンスへの影響を最小限に抑える

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

で数行にわたるクエリを構築することができる理由

です。

もう一度ベンチマークを試してください(マイケルが示唆しているように)、クエリを実行する配列にリレーションを変更してください。

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

ああ。 比較: 最初に:986.6 i/s find:940.7 i/s - 同じish:差異が誤差内に入る ここで:931.6 i/s - 同じish:差は誤差内に収まる – Philip