sqlite一次插入多条记录的优化方法

Date: 2014-08-09
Summary: 有大量的数据要插入数据库,但是每次只写入一条在速度上很难接受。本文介绍了在sqlite数据库中一次插入多条记录的优化方法。

sqlite一次插入多条记录的优化方法

问题

今天在使用sqlite向表中插入数据的时候发现,对于一次插入多条记录的问题来说,insert into的执行速度慢到了无法接受。我在实际的使用中,想一次性插入200条记录,要做1000次左右的插入,这样的话,我每次都要把200条记录的插入语句组织成一个长字符串,然后执行一次executeUpdate语句。没想到插入操作这么慢,只好请教搜索引擎,看有没有什么好办法。

试验

答案当然是有的。因为我一直使用的sql语句是类似MySQL的:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');

根据网友的回复,只需要使用不同的语法,在SQLite中把插入语句重写成:

INSERT INTO 'tablename'
SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION SELECT 'data3', 'data4'
UNION SELECT 'data5', 'data6'
UNION SELECT 'data7', 'data8'

我把原来的代码改成新的代码以后,发现速度明显是快多了!简单做了一下测试,原来的方法做10次插入操作,每次写入如200条数据已经需要222137ms,新的方法做同样的操作只需要1841ms,这到底是什么节奏?

查看了一下SQLite的官方文档,原来insert 还真有这种用法的。

SQLite insert

sqlite insert

而且官方文档上面很明确的说明,insert语句有三种基本的形式,但是性能上为什么会有如此大的差别?这个还真是没有想明白。。。

怎样检查一个表是否存在

另外顺便记一下,在SQLite中查询一个表是否存在的方法:

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name';

table_name就是传进去要查找的表的名字,当然也可以不要。这个语句会返回数据库中的表名字哦!

参考

http://stackoverflow.com/questions/1609637/is-it-possible-to-insert-multiple-rows-at-a-time-in-an-sqlite-database/1734067#1734067

http://stackoverflow.com/questions/1601151/how-do-i-check-in-sqlite-whether-a-table-exists

http://www.sqlite.org/lang_insert.html

推荐阅读更多精彩内容

  • 说明 本文是作者Lefe所创,转载请注明出处,如果你在阅读的时候发现问题欢迎一起讨论。本文会不断更新。 正文 对于...
    Lefe阅读 1,855评论 1 18
  • 1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:2、创建...
    依忆依意壹懿阅读 346评论 0 0
  • 移动客户端中高效使用 SQLite 转发自 2016-08-18赵丰腾讯Bugly 导语 iOS 程序能从网络获取...
    树懒啊树懒阅读 1,330评论 1 19
  • 这个SQLite快速入门教程教你如何有效地开始学习并使用SQLite。通过本教程的实践操作学习之后,相信你应该可以...
    易百教程阅读 10,089评论 1 63
  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 2,550评论 0 14