2016-05-19 3 views
1

mongodbには2つの同等のメソッドがあると思われます。モンゴイデスの塊とは異なる。それは速いですか?

#pluck#distinct両方ともコレクションから特定のフィールドだけを返します。

ので、両方

User.pluck(:name) 
User.distinct(:name) 

は、私は重複を気にしないデシベル

> ['john', 'maria', 'tony', 'filip'] 

でのユーザーのコレクションからすべての名前の配列を返します。どちらの方法が速いのですか?

答えて

8

ベンチマークを実行しましょう!それは明らか#distinctを使用して#pluck

のほぼ2倍高速であることを示している

Rehearsal ------------------------------------------------ 
pluck   0.010000 0.000000 0.010000 ( 0.009913) 
pluck.uniq  0.010000 0.000000 0.010000 ( 0.012156) 
only.pluck  0.000000 0.000000 0.000000 ( 0.008731) 
distinct  0.000000 0.000000 0.000000 ( 0.004830) 
only.distnct 0.000000 0.000000 0.000000 ( 0.005048) 
--------------------------------------- total: 0.020000sec 

        user  system  total  real 

pluck   0.000000 0.000000 0.000000 ( 0.007904) 
pluck.uniq  0.000000 0.000000 0.000000 ( 0.008440) 
only.pluck  0.000000 0.000000 0.000000 ( 0.008243) 
distinct  0.000000 0.000000 0.000000 ( 0.004604) 
only.distnct 0.000000 0.000000 0.000000 ( 0.004510) 

:出力

require 'benchmark' 


1_200.times { FactoryGirl.create(:user) } 

Benchmark.bmbm(7) do |bm| 
    bm.report('pluck') do 
    User.pluck(:email) 
    end 

    bm.report('pluck.uniq') do 
    User.pluck(:email).uniq 
    end 

    bm.report('only.pluck') do 
    User.only(:email).pluck(:email) 
    end 

    bm.report('only.pluck.uniq') do 
    User.only(:email).pluck(:email).uniq 
    end 

    bm.report('distinct') do 
    User.distinct(:email) 
    end 

    bm.report('only.distnct') do 
    User.only(:email).distinct(:email) 
    end 
end 

関連する問題