分享

Qt插入大量数据到sqlite数据库,使用事务提升效率(效率提高的惊人)

 slimfeng 2019-05-05

Qt在操作大量数据执行插入操作时,推荐使用事务

1.SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec(“insert into DataBase(……) values(……)”);就会打开和关闭文件100万次,所以速度当然会很慢。

2.SQLite数据库是支持事务操作的,于是我们就可以通过事务来提高数据库的读写速度。事务的基本原理是:数据库管理系统首先会把要执行的sql语句存储到内存当中,只有当commit()的时候才一次性全部执行所有内存中的数据库。

不用事务

如果不用事务,插入1000条数据到sqlite数据库,要执行1000次开启事务、结束事务,大致意思如下图:

这里写图片描述

使用事务

如果使用事务,存储1000条数据到sqlite数据库,只需要执行一次开启事务、结束事务操作,大致意思如下图:

这里写图片描述

时间成本应该就是节约在多余的开启事务和结束事务这里。

口说无凭,下面上截图,大致存储了6000条数据,使用事务之前,需要花费7分钟左右,下面是使用事务之后,仅仅用了2秒钟:

这里写图片描述

Qt中使用事务的大致方法:

db.transaction();

执行插入的sql(n条插入操作)

db.commit();

实例

下面是一段我写的代码,insert是我封装的一个执行sql语句的接口:

/添加数据到XXX表/bool DbManager::appendData2MfCali(const QList &data) {     if(data.isEmpty())         return false;     mDb->beginTransaction(); //开启事务     foreach (MfCalibrate v, data)     {         QVector fieldValue;         fieldValue.append(QString::number(v.RfChannel));              fieldValue.append(QString::number(v.MfChannel));              fieldValue.append(QString::number(v.RfFreq));                fieldValue.append(QString::number(v.CollectValue));           fieldValue.append(QString::number(v.AmpCaliValue));           if(!mDb->insert("XXX表",mMfCaliFieldsName , fieldValue))             return false;     }     mDb->commitTransaction(); //提交     return true; }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多