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]