首页 » 网站建设 » phpsqlite记载总数技巧_SQLite批量INSERT

phpsqlite记载总数技巧_SQLite批量INSERT

访客 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

在SQLite数据库中进行大批量记录INSERT,有三种方法,三种方法的效率由高低,本文举例解释。

方法一:逐条记录INSERT,这也是效率最低的方法

下面以逐条记录INSERT的方法,向SQLite数据库插入1000条数据,看一下耗时多长。

phpsqlite记载总数技巧_SQLite批量INSERT

预先创建数据库myDB.db,在个中创建表myTabel:

phpsqlite记载总数技巧_SQLite批量INSERT
(图片来自网络侵删)

CREATE TABLE IF NOT EXISTS my_table ( \ id INTEGER PRIMARY KEY, \ a TEXT, \ b INTEGER)

个中,id字段为自增字段,INSERT时,只须要供应a和b的值即可,代码如下:

#include <chrono>#include <iostream>#include <thread>#include <QSqlDatabase>#include <QSqlQuery>#include <QSqlError>//办法一:单条记录逐条INSERTauto tms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock().now().time_since_epoch()).count();for(int i = 0; i < 1000; i++){ int b = i + 1; QString a = QString("a_%1").arg(b); sql = QString("INSERT INTO myTable (a, b) VALUES('%1', %2)").arg(a).arg(b); if(!query.exec(sql)) { std::cout << "INSERT INTO failed" << std::endl; db.close(); return 0; }}auto tme = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock().now().time_since_epoch()).count();int span = static_cast<int>(tme - tms);std::cout << "办法一:插入1000条记录耗时 " << span << " 毫秒!
" << std::endl;//以上程序输出 办法一:插入1000条记录耗时 171978 毫秒!

以上可见,利用逐条记录INSERT的方法,插入1000条记录到SQLite数据库,须要耗时172秒(171987毫秒)!

方法二,利用 UNION ALL 的SQL语句批量INSERT,这个方法效率居中

”UNION ALL” 是一种用来合并两个或多个 SQL 查询结果集的操作符。
与 “UNION” 不同的是,”UNION ALL” 不会去重查询结果集,而是将所有的行都包含在结果中。

SQLite中的代码天生器会利用一种递归算法来对复合SELECT语句进行处理。
对栈的大小有必要进行一下限定,我们会由于这个缘故对复合SELECT中的段落数量进行限定。
段落的最大数量限定参数便是 SQLITE_MAX_COMPOUND_SELECT ,其默认值为 500。

由于UNION ALL的记录数目最大被限定为500条,因此,以下代码中,将1000条记录分拆成500条的2个部分进行INSERT操作:

//办法二:1000条记录合并到一个INSERT语句插入//SQLITE_MAX_COMPOUND_SELECT限定500条auto tms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock().now().time_since_epoch()).count();QString sql = "INSERT INTO my_table(a, b) ";for(int i = 0; i < 500; i++){ int b = i + 1; QString a = QString("a_%1").arg(b); sql += QString("SELECT '%1', %2 ").arg(a).arg(b); if(i != 499) sql += "UNION ALL ";}if(!query.exec(sql)){ std::cout << "UNION 1 INSERT INTO failed : " << query.lastError().text().toStdString() << std::endl; db.close(); return;}sql = "INSERT INTO my_table(a, b) ";for(int i = 500; i < 1000; i++){ int b = i + 1; QString a = QString("a_%1").arg(b); sql += QString("SELECT '%1', %2 ").arg(a).arg(b); if(i != 999) sql += "UNION ALL ";}if(!query.exec(sql)){ std::cout << "UNION 2 INSERT INTO failed : " << query.lastError().text().toStdString() << std::endl; db.close(); return;}auto tme = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock().now().time_since_epoch()).count();int span = static_cast<int>(tme - tms);std::cout << "办法二:插入1000条记录耗时 " << span << " 毫秒!
" << std::endl;//以上程序输出 办法二:插入1000条记录耗时 310 毫秒!

以上可见,利用UNION ALL的SQL语句批量INSERT的方法,插入1000条记录到SQLite数据库,须要耗时0.31秒(310毫秒)!

方法三,开缘由务,逐条记录INSERT,提交事务,这是效率最高的方法

在SQLite中,事务是一种机制,用于确保数据库操作的同等性和完全性。
事务通过担保一系列操作的成功或失落败不会影响数据库的状态来实现这一点。

以下代码通过启动事务,逐条插入,末了提交事务的办法将1000条记录插入SQLite数据库:

//办法三:启动事务,单条记录逐条INSERT,提交事务auto tms = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock().now().time_since_epoch()).count();//启动事务db.transaction();//逐条插入for(int i = 0; i < 1000; i++){ int b = i + 1; QString a = QString("a_%1").arg(b); sql = QString("INSERT INTO my_table (a, b) VALUES('%1', %2)").arg(a).arg(b); if(!query.exec(sql)) { std::cout << "transaction INSERT INTO failed" << std::endl; db.rollback(); db.close(); return; }}//提交事务db.commit();auto tme = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock().now().time_since_epoch()).count();int span = static_cast<int>(tme - tms);std::cout << "办法三:插入1000条记录耗时 " << span << " 毫秒!
" << std::endl;//以上程序输出 办法三:插入1000条记录耗时 192 毫秒!

以上可见,利用通过启动事务,逐条插入,末了提交事务的办法,插入1000条记录到SQLite数据库,须要耗时0.192秒(192毫秒)!

标签:

相关文章