为了账号安全,请及时绑定邮箱和手机立即绑定

SQLite 插入大量数据慢的解决方法

sqlite 插入数据很慢的原因:sqlite在没有显式使用事务的时候会为每条insert都使用事务操作,而sqlite数据库是以文件的形式存在磁盘中,就相当于每次访问时都要打开一次文件,如果对数据进行大量的操作,时间都耗费在I/O操作上,所以很慢。
解决方法是显式使用事务的形式提交:因为我们开始事务后,进行的大量操作的语句都保存在内存中,当提交时才全部写入数据库,此时,数据库文件也就只用打开一次。
我在没有显式使用事务形式插入100条数据时用了12.226s;用显式事务形式,插入100条只用了0.172s,插入1000000条也才34.891s,相关很大吧。
显式使用事务的例子:

include <iostream>
include <windows.h>

using namespace std;

include "sqlite/sqlite3.h"

int main()
{
sqlite3* db;
int nResult = sqlite3_open("test.db",&db);
if (nResult != SQLITE_OK)
{
cout<<"打开数据库失败:"<<sqlite3_errmsg(db)<<endl;
return 0;
}
else
{
cout<<"数据库打开成功"<<endl;
}

char* errmsg;

nResult = sqlite3_exec(db,"create table fuck(id integer primary key autoincrement,name varchar(100))",NULL,NULL,&errmsg);
 if (nResult != SQLITE_OK)
 {
     sqlite3_close(db);
     cout<<errmsg;
     sqlite3_free(errmsg);
    return 0;
}

string strSql;
strSql+="begin;\n";
for (int i=0;i<100;i++)
{
    strSql+="insert into fuck values(null,'heh');\n";
}
strSql+="commit;";
//cout<<strSql<<endl;

SYSTEMTIME tm_s;
GetLocalTime(&tm_s);

nResult = sqlite3_exec(db,strSql.c_str(),NULL,NULL,&errmsg);

SYSTEMTIME tm_e;
GetLocalTime(&tm_e);

if (nResult != SQLITE_OK)
{
    sqlite3_close(db);
    cout<<errmsg<<endl;
    sqlite3_free(errmsg);
    return 0;
}

cout<<"start:"<<tm_s.wMinute<<":"<<tm_s.wSecond<<":"<<tm_s.wMilliseconds<<endl;
cout<<"end  :"<<tm_e.wMinute<<":"<<tm_e.wSecond<<":"<<tm_e.wMilliseconds<<endl;

return 0;

}

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
168
获赞与收藏
3550

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消