mongodb的set,inc,push比較

老實說,我並非很清楚爲何這3個要放在一塊兒比較,inc和set有類似的地方,push和這2個感受徹底不同啊。mongodb

實驗中用的是ruby的mongo_ruby_driver來寫程序的,爲了得到比較精確的數值,我使用了benchmark這個module,反覆執行set,inc,push各3000次。代碼以下ruby

#!/usr/bin/env ruby
# 20140301, mongo_test.rb
###
# test inc, set, push
###


require "rubygems"
require "mongo"
require "benchmark"

class MongoConnection
  def initialize(host, port)
    @mongoconn = Mongo::MongoClient.new(host, port)
    @db = @mongoconn.db("test")
  end

  def test()
    @coll = @db.collection("test")

    # set test
    @coll.insert({"num"=>0})
    tm_start = Time.now.to_f
    # (1..3000).each { |i| @coll.update({ }, { "$set" => {"num"=>i} } ) }
    Benchmark.bm do |t|
      t.report{ (1..3000).each { |i| @coll.update({ }, { "$set" => {"num"=>i} } ) } }
    end
    # p @coll.find.to_a
    tm_used = Time.now.to_f - tm_start
    puts "set Time used(s): #{tm_used}"
    @coll.drop

    # inc test
    @coll.insert({"num"=>0})
    tm_start = Time.now.to_f
    # (1..3000).each { |i| @coll.update({ }, { "$inc" => {"num"=>1} } ) }
    Benchmark.bm do |t|
      t.report{ (1..3000).each { |i| @coll.update({ }, { "$inc" => {"num"=>1} } ) } }
    end
    # p @coll.find.to_a
    tm_used = Time.now.to_f - tm_start
    puts "inc Time used(s): #{tm_used}"
    @coll.drop

    # push test
    @coll.insert({"num"=>[0]})
    tm_start = Time.now.to_f
    # (1..3000).each { |i| @coll.update({ }, { "$push" => {"num"=>i} } ) }
    Benchmark.bm do |t|
      t.report{ (1..3000).each { |i| @coll.update({ }, { "$push" => {"num"=>i} } ) } }
    end
    # p @coll.find.to_a
    tm_used = Time.now.to_f - tm_start
    puts "push Time used(s): #{tm_used}"
    @coll.drop

  end

end

mongo_conn = MongoConnection.new("localhost", 27017)

mongo_conn.test()

測試結果以下測試

       user     system      total        real
   1.570000   0.130000   1.700000 (  2.180069)
set Time used(s): 2.1805129051208496
       user     system      total        real
   1.480000   0.140000   1.620000 (  2.059199)
inc Time used(s): 2.0596039295196533
       user     system      total        real
   1.850000   0.200000   2.050000 (  6.312153)
push Time used(s): 6.312557935714722

實際上,從反覆執行的結果來看,set和inc基本是在同一個時間量級上,也不必定set就比inc快,也有相反的時候;而push的時間始終比較慢。這個跟rdbms的結果差別很大,rdbms的set和inc用的是update來實現,push用insert來實現,單個update語句產生的redo log要比insert多,因此通常update比insert要慢。可是,mongodb的結果與此相差很大,懷疑跟其存儲引擎有關。ui

相關文章
相關標籤/搜索