`
CharlesCui
  • 浏览: 427473 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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


结果如下:

-----------------------------------------------------------------

                  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物理文件的读写很慢,而且并发有问题。
分享到:
评论
5 楼 iwantobelieve 2009-01-08  
antter 写道
我用的是MySQL,使用innodb数据库development.log记录ActiveRecord每个save都会进行一次begin transaction和commit,极大的大数量影响插入速度。Sqlite3使用的也是支持事务的数据库因该也一样。

如果每1000条数据进行一次commit那插入速度会快上百倍乃至千倍

我最近在做的就是每1000条数据作为一个事务。一共是40万条数据。
4 楼 antter 2008-12-31  
我用的是MySQL,使用innodb数据库development.log记录ActiveRecord每个save都会进行一次begin transaction和commit,极大的大数量影响插入速度。Sqlite3使用的也是支持事务的数据库因该也一样。

如果每1000条数据进行一次commit那插入速度会快上百倍乃至千倍
3 楼 CharlesCui 2008-12-31  
icefishc 写道

sqlite的锁机制比较简单它会把整个文件锁上 所以很自然它的并发性能不好不知道当sqlite作为内存数据库时它是怎么处理锁的 但我猜测不会好太多期待LZ的进一步测试 :)


好的,我也想测一下呢。
2 楼 icefishc 2008-12-31  
sqlite的锁机制比较简单
它会把整个文件锁上 所以很自然它的并发性能不好

不知道当sqlite作为内存数据库时它是怎么处理锁的 但我猜测不会好太多

期待LZ的进一步测试 :)
1 楼 ShiningRay 2008-12-30  
sqlite只适合非常小的应用

相关推荐

    在Ruby on Rails中优化ActiveRecord的方法

    11. **批量插入**:大量数据插入时,使用`create`或`update`方法会慢,应使用`create!`或`update!`批量操作。 12. **延迟加载和懒加载**:理解ActiveRecord的懒加载机制,避免在初始化对象时立即加载关联数据。 13...

    使用php写 yii2框架 医院量表录入

    例如,创建一个表单模型类,继承自yii\db\ActiveRecord,定义对应的属性和规则,然后通过save()方法即可完成数据的插入和更新。此外,Yii2还支持数据库查询构建器,方便进行复杂的SQL查询。 对于大型系统,数据库...

    Jfinal框架基础SQL数据库操作(基于MySql).没有数据库操作内容

    - **插入**:通过`save()`方法插入新记录,例如`new User().set("username", "test").save();` - **更新**:`update()`方法用于更新已有记录,如`new User().setId(1).set("username", "updated").update();` - *...

    实战Mobile软件工厂之数据库篇

    3. SQL基础:学习SQL语句,包括SELECT、INSERT、UPDATE和DELETE,用于查询、插入、更新和删除数据。了解JOIN操作用于关联不同表的数据,以及索引的创建和优化以提升查询速度。 4. 数据库安全性:理解如何加密数据库...

    中小型企业使用thinkphp搭建

    7. **数据库管理**:在ThinkPHP中,可以使用Model类直接操作数据库,或者使用Db类进行底层数据库操作,如查询、插入、更新和删除数据。 8. **企业系统功能**:结合SQL文件名(如my_qyjj.sql可能代表企业简介,my_...

    一款基于thinkphp+bootstrap开发的开源博客系统

    1. **数据查询**:通过SQL语句进行数据的检索、插入、更新和删除。 2. **索引优化**:创建合适的索引来加速查询速度。 3. **事务处理**:保证数据的一致性和完整性,例如在并发环境中处理用户的发表和评论操作。 4. ...

    thinkphp5的demo,方便入门学习,含数据库

    缓存管理则可以提高数据读取速度,减轻数据库负载。 这个demo应该包含了一些基本的CRUD操作示例,如添加新用户、显示用户列表、编辑用户信息和删除用户。通过学习和实践这些例子,你可以了解ThinkPHP5框架的核心...

    PHP学生成绩查询(源代码+论文).rar

    因此,了解如何创建数据库、表结构、插入、查询、更新和删除数据是必要的。 3. **Web表单与HTTP协议**:用户通过网页表单提交查询请求,这涉及到HTML表单元素的使用以及HTTP的GET或POST方法。理解这些基本的Web交互...

    thinkPHP手册

    2. ORM(Object-Relational Mapping):thinkPHP的ActiveRecord模式使得数据库操作对象化,简化了SQL语句的编写。 3. 增删改查:通过模型对象的方法,如save()、delete()、update()等,实现对数据库的修改操作。 4...

    应用Yii1.1和PHP5进行敏捷Web开发

    Yii 提供了 ActiveRecord 数据持久化模式,使得数据库操作变得简单易行。通过继承 CActiveRecord 类,你可以快速创建数据模型,实现对数据库表的操作,如查询、插入、更新和删除。同时,Yii 还支持 SQL 查询构建器...

    thinkPHP5.1开发手册

    6. **数据库操作**:ThinkPHP5.1提供了ActiveRecord模式的数据库操作,可以方便地进行数据查询、插入、更新和删除等操作,支持关联查询和数据验证,保证数据的完整性和一致性。 7. **缓存管理**:框架内置了多种...

    ruby on rails入门

    ### Ruby on Rails 入门知识点详解 #### Rails简介与特性 ...Rails 的强大之处不仅在于其高效的开发速度,更在于其灵活的设计思想和丰富的生态系统。希望每位开发者都能从中获得启发,创造出更多优秀的作品。

    ThinkPHP_3.1最新版

    其ActiveRecord模式让数据库操作更加简便,SQL语句的生成和执行都变得更加直观。同时,增加了事务处理和预处理语句,增强了数据安全性。 四、模板引擎改进 3.1版本的模板引擎ThinkTemplate在保持易用性的同时,...

    Thinkphp3.1.3视频黄永成老师教程的许愿墙

    黄永成老师会讲解如何使用Thinkphp的ActiveRecord模式进行CRUD(Create, Read, Update, Delete)操作,包括建立数据表结构,插入、查询、更新和删除许愿信息。 7. **安全性考虑**:为了防止SQL注入等安全问题,教程...

    Grails 中文参考手册

    - **GORM (Grails Object-Relational Mapping)**: GORM 是Grails 提供的ORM工具,允许开发者以面向对象的方式操作数据库,支持Hibernate和ActiveRecord风格的数据访问。 - **GRAILS CLI**: Grails 提供了一个命令行...

    Android源码——afinal开源框架实例源码_new_03.7z

    - **数据库操作**:有了实体类后,我们就可以使用Afinal进行增删改查操作,如插入数据: ```java User user = new User(); user.setName("Test"); db.save(user); ``` 查询数据: ```java List&lt;User&gt; users ...

    Android Afinal开发框架详解

    它基于ActiveRecord设计模式,允许开发者通过简单的Java对象与SQLite数据库进行交互,而无需编写SQL语句。Afinal提供了以下特性: 1. **实体类和数据库表的映射**:通过在Java类上添加@Entity注解,可以将类映射到...

    jfinal开发实例

    2. 数据缓存:JFinal集成了Memcached和Redis等缓存服务,可以有效提升数据访问速度。 3. RESTful支持:JFinal支持RESTful风格的URL,方便构建前后端分离的Web应用。 4. AOP支持:JFinal的Interceptor机制实现了...

    SubSonic2.1

    3. **ActiveRecord模式**:SubSonic提供了对ActiveRecord设计模式的支持,使得对象与数据库表之间的映射变得简单。开发者可以直接操作对象,而无需关心底层的数据库交互。 4. **Linq支持**:尽管2.1版本可能不包含...

    ThinkPHP3.0_完全开发手册(1).pdf

    通过模型可以插入新记录到数据库中。 **6.11 字段映射** 字段映射可以将模型中的字段与数据库中的字段进行一一对应。 **6.12 连贯操作** 连贯操作允许在一次调用中执行多个数据库操作。 **6.13 CURD 操作** ...

Global site tag (gtag.js) - Google Analytics