天天看點

ActiveRecord插入資料速度比較

ORM:ActiveRecord

Database:Sqlite3

一共兩種方式,

方式一:通過ORM對象new,然後指派,最後儲存。

方式二:通過ActiveRecord::Base.connection.execute(sql)直接執行,

人家說方式二效率高,是以我想知道真的高假的高,高又能高多少,順便看看Sqlite3的速度。

主要測試代碼如下:

sql7=proc {<<SQL
insert into udb_user(user_id,user_name,creator) 
values("#{(rand*10**20).round}","user#{(rand*10**20).round}",'CuiZheng1')
SQL
}

InsertBySQL=proc do |x|
  proc do
    x.times{ActiveRecord::Base.connection.execute(sql7.call.gsub("\n"," "))}
  end
end

InsertByAR=proc do |x|
  proc do
    x.times do
      _tempUU=UdbUser.new
      _tempUU.USER_ID=(rand*10**20).round.to_s
      _tempUU.USER_NAME="user#{(rand*10**20).round}"
      _tempUU.CREATOR='CuiZheng2'
      _tempUU.save!
    end
  end
end

Benchmark.bm(20) do |x|
  x.report("InsertByAR",&(InsertByAR.call(10**3)))
  x.report("InsertBySQL",&(InsertBySQL.call(10**3)))
end
           

結果如下:

差別不大!

[size=large]開始跑的時候我打算各插100萬條記錄,太慢了,而且中途我通過cmd連結到那個sqlite3資料庫上,執行了select count(*) ,結果ruby插資料的這個[color=darkred]連結斷掉[/color]了,報錯說目前sqlite3連結非常的busy!感覺sqlite3好脆弱啊!

我想可不可以這樣用sqlite3,啟動的時候把資料庫全都加載到記憶體,所有的增删改操作直接同步的對記憶體中的sqlite3操作,但放到一個隊列裡,異步的對sqlite3實體檔案操作。

或者這樣行不行,把sqlite3啟動時加載到memcache裡面好了,再啟動一個任務定時的attach到實體檔案。

反正都是放到記憶體裡,因為感覺sqlite3實體檔案的讀寫很慢,而且并發有問題。[/size]