浏览 4135 次
锁定老帖子 主题:ActiveRecord插入数据速度比较
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-30
最后修改:2009-03-30
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 结果如下: ----------------------------------------------------------------- Insert Records ----------------------------------------------------------------- user system total real InsertByAR 2.703000 6.891000 9.594000 ( 91.735000) InsertBySQL 0.578000 6.047000 6.625000 ( 94.265000) 区别不大! 开始跑的时候我打算各插100万条记录,太慢了,而且中途我通过cmd链接到那个sqlite3数据库上,执行了select count(*) ,结果ruby插数据的这个链接断掉了,报错说当前sqlite3链接非常的busy!感觉sqlite3好脆弱啊! 我想可不可以这样用sqlite3,启动的时候把数据库全都加载到内存,所有的增删改操作直接同步的对内存中的sqlite3操作,但放到一个队列里,异步的对sqlite3物理文件操作。 或者这样行不行,把sqlite3启动时加载到memcache里面好了,再启动一个任务定时的attach到物理文件。 反正都是放到内存里,因为感觉sqlite3物理文件的读写很慢,而且并发有问题。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-30
sqlite只适合非常小的应用
|
|
返回顶楼 | |
发表时间:2008-12-31
sqlite的锁机制比较简单
它会把整个文件锁上 所以很自然它的并发性能不好 不知道当sqlite作为内存数据库时它是怎么处理锁的 但我猜测不会好太多 期待LZ的进一步测试 :) |
|
返回顶楼 | |
发表时间:2008-12-31
icefishc 写道 sqlite的锁机制比较简单它会把整个文件锁上 所以很自然它的并发性能不好不知道当sqlite作为内存数据库时它是怎么处理锁的 但我猜测不会好太多期待LZ的进一步测试 :) 好的,我也想测一下呢。 |
|
返回顶楼 | |
发表时间:2008-12-31
我用的是MySQL,使用innodb数据库development.log记录ActiveRecord每个save都会进行一次begin transaction和commit,极大的大数量影响插入速度。Sqlite3使用的也是支持事务的数据库因该也一样。
如果每1000条数据进行一次commit那插入速度会快上百倍乃至千倍 |
|
返回顶楼 | |
发表时间:2009-01-08
antter 写道 我用的是MySQL,使用innodb数据库development.log记录ActiveRecord每个save都会进行一次begin transaction和commit,极大的大数量影响插入速度。Sqlite3使用的也是支持事务的数据库因该也一样。 如果每1000条数据进行一次commit那插入速度会快上百倍乃至千倍 我最近在做的就是每1000条数据作为一个事务。一共是40万条数据。 |
|
返回顶楼 | |