关于sqlite的事务的使用

缘起

sqlite写入500条不大的记录居然要花费20多秒的时间,太慢了!!!

分析

sqlite是一个非常优秀的嵌入式数据库,读取性能非常好,写入性能就比较差一些,为什么写入性能差呢?下面做了一个测试。

下面是对500+条记录些操作的系统调用的观察,发现时间基本花费在了fdatasync系统调用上,调用2064次;write系统调用虽然8049次,但是write并不保证逻辑,所以速度很快。

 

查资料

http://www.cnblogs.com/KimSky/archive/2011/05/31/2064028.html

发现: 如果使用事务的方式批量插入数据,效果会有明显改善,因为默认情况下每次写入操作都会落地才返回的(更加安全靠谱),如果使用事务,则批量数据一次性落地。

修改代码,分析系统调用如下:(发现fdatasync调用12次)

 

结论:

1. 借用事务采用批量写入的方式来加速写操作

2. 如果业务上不能批量操作呢?似乎有一个nosync的sqlite版本(不知道为什么不是一个配置选项)

参考资料: http://www.sqlite.org/speed.html

3. 如果数据量太大,可以分多批提交事务,因为事务是需要内存的。(不过,sqlite一般不会存放N个G的数据的,几百MB已经算是比较大的了,这样的数据量内存还是吃的消的)

 

参考资料:

http://www.phpchina.com/archives/view-33876-1.html

 

关于sqlite的系列分析文章(可以看看)

http://www.cnblogs.com/hustcat/archive/2009/02/12/1389448.html

 

SQLite的原子提交原理

http://www.cnblogs.com/vagerent/archive/2008/11/05/1327247.html

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据