您的位置:首页 > 数据库

sqlite插入数据效率提升解决方案

2016-03-21 15:14 302 查看
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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: