sqlite插入数据效率提升解决方案
2016-03-21 15:14
302 查看
Sqlite插入效率对比
create table if not existstttable(id integer primary key autoincrement,name varchar(100))
笔者电脑配置:
硬盘是250G三星ssd硬盘
cpu、OS、内存如下
sqlite 插入数据很慢的原因:sqlite在没有显式使用事务的时候会为每条insert都使用事务操作,而sqlite数据库是以文件的形式存在磁盘中,就相当于每次访问时都要打开一次文件,如果对数据进行大量的操作,时间都耗费在I/O操作上,所以很慢。
解决方法是显式使用事务的形式提交:因为我们开始事务后,进行的大量操作的语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也就只用打开一次。
结论:
(1) 效率最高:使用“事务+cpp调用方式”的方案插入效率最高。对比测试一、四的commit插入即可得到该结论。
(2) 其次:使用“事务+一次插入多条记录”的方案。
(3) 再次:使用“事务”次之
(4) 与要插入的记录数有关。数量越多,效率的差别越明显。
(5) 对比测试一、三可以看出,一次插入多条记录的方案,在记录数为“万”级别时效率上的提升也并不明显,仍然只有“秒”级。
(1) 直接执行insert语句,一个sql语句插入一条记录。
(2) 在一个insert语句中添加多个“值组”,即一个insert插入多条记录。
(3) 使用事务(Transaction)。
(4) 存储过程。
分析:
(1) 在记录较多时,一次插入多条记录比一次插入单条记录效率高。
(2) 在记录较多时,使用事务能显著提升插入效率。
(3) 使用存储过程比单纯的插入的sql语句效率高。但是,Sqlite不支持存储过程。
1. 基本信息
建表:create table if not existstttable(id integer primary key autoincrement,name varchar(100))
笔者电脑配置:
硬盘是250G三星ssd硬盘
cpu、OS、内存如下
2. 插入效率对比
2.1 理论及结论
理论:sqlite 插入数据很慢的原因:sqlite在没有显式使用事务的时候会为每条insert都使用事务操作,而sqlite数据库是以文件的形式存在磁盘中,就相当于每次访问时都要打开一次文件,如果对数据进行大量的操作,时间都耗费在I/O操作上,所以很慢。
解决方法是显式使用事务的形式提交:因为我们开始事务后,进行的大量操作的语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也就只用打开一次。
结论:
(1) 效率最高:使用“事务+cpp调用方式”的方案插入效率最高。对比测试一、四的commit插入即可得到该结论。
(2) 其次:使用“事务+一次插入多条记录”的方案。
(3) 再次:使用“事务”次之
(4) 与要插入的记录数有关。数量越多,效率的差别越明显。
(5) 对比测试一、三可以看出,一次插入多条记录的方案,在记录数为“万”级别时效率上的提升也并不明显,仍然只有“秒”级。
2.2 思路和分析:
插入的方法分为:(1) 直接执行insert语句,一个sql语句插入一条记录。
(2) 在一个insert语句中添加多个“值组”,即一个insert插入多条记录。
(3) 使用事务(Transaction)。
(4) 存储过程。
分析:
(1) 在记录较多时,一次插入多条记录比一次插入单条记录效率高。
(2) 在记录较多时,使用事务能显著提升插入效率。
(3) 使用存储过程比单纯的插入的sql语句效率高。但是,Sqlite不支持存储过程。
2.3 测试一:使用事务对比
结论:由下表可以明显看出,使用事务比不使用,要插入的记录数越多则效率越明显。记录数 | Commit插入耗时 | 无commit 插入耗时 |
1 | 0.091149 s | 0.095510 s |
10 | 0.073623 s | 0.908365 s |
100 | 0.107786 s | 8.494171 s |
1000 | 0.164266 s | 91.384458 s |
1万 | 0.498805 s | 417.994334 s 约7分钟 |
10万 | 10.655899 s | 9437.470941 s 约157分钟 |
2.4 测试二:
一次只执行一个插入记录数 | Commit插入耗时 | 无commit 插入耗时 |
1 | 0.089691 s | 0.078871 s |
10 | 0.839161 s | 1.049796 s |
100 | 8.439179 s | 8.845316 s |
1000 | 88.707938 s | 90.850646 s |
1万 | ||
10万 |
2.5 方式三
一条sql语句插入多条记录,有commit。实例sql语句如下,代码使用一次5条。记录数 | 有commit | 无commit 插入 |
10 | 0.077758 s | 0.153611 s |
100 | 0.104861 s | 1.842270 s |
1000 | 0.100431 s | 19.040623 s |
1万 | 0.248039 s | 188.313666 s |
10万 | 1.948906 s | 1878.265314 s |
100万 | 17.430737 s |
2.6 测试四
使用sqlite3提供的c++的调用方法测试插入效率。记录数 | 有commit | 无commit 插入 |
1 | 0.000898 s | 0.000898 s |
10 | 0.000837 s | 0.007919 s |
100 | 0.001376 s | 0.084375 s |
1000 | 0.006201 s | 0.849675 s |
1万 | 0.051841 s | 8.948034 s |
10万 | 0.540143 s | 88.447533 s |
100万 | 5.280978 s | |
1000万 | 54.055197 s |
相关文章推荐
- 在谈Redis应用场景
- mysql explain的用法(使用explain优化查询语句)
- Redis计数在新浪微博的应用
- MongoDB_WINDOW7_安装步骤
- 微博关系服务与Redis
- 将所有对象存到数据库中
- oracle 创建、删除唯一性约束
- ubuntu14.04安装Oracle_linux_x64_11gR2
- Entity Freamwork 6连接PostgreSql数据库
- percona server的特点介绍
- 灵活运用 SQL SERVER FOR XML PATH
- 解决 mysql error: Failed dependencies: 错误
- 自己封装的C#操作redis公共类
- sql语句同一时间下不同字段的数量
- oracle 表空间的处理
- Mysql占cpu近100%解决思路
- Mysql 创建表外键
- sql参数化查询避免注入漏洞的原因探析
- SQL数据库损坏怎么办?教你数据恢复应急方案
- mysql保障数据一致性:redis与mysql数据同步(二)