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 |
|