【数据库】sqlit循环插入速度慢优化

  • 系统: win10
  • IDE: QT(Qt Quick)

优化前

循环往表中插入10000条数据

/*插入*/
bool Sqlite::dbInsert(QSqlDatabase *_db)
{
    QSqlQuery * _sql = new QSqlQuery(*_db);
    QTime t;
    t.start();

    for(int i = 0; i < 10000; ++i)
    {
        _sql->prepare(QString("insert into '%1' values(?,?)").arg(strTableName));
        _sql->bindValue(0,"s");
        _sql->bindValue(1,i);
        _sql->exec();
        if(!_sql->execBatch())
        {
            cout<<_sql->lastError();
        }
    }

    cout<<"插入用时:"<<t.elapsed();

    return true;
}

消耗时间太长了,我的数据库还在固态硬盘里
在这里插入图片描述

优化后

在循环外加上
_db->transaction();:表示开始一个事务;
_db->commit();:表示提交,将事务中的所有对数据库的操作写回数据库;

/*插入*/
bool Sqlite::dbInsert(QSqlDatabase *_db)
{
    QSqlQuery * _sql = new QSqlQuery(*_db);
    QTime t;
    t.start();
    _db->transaction();
    for(int i = 0; i < 10000; ++i)
    {
        _sql->prepare(QString("insert into '%1' values(?,?)").arg(strTableName));
        _sql->bindValue(0,"s");
        _sql->bindValue(1,i);
        _sql->exec();
        if(!_sql->execBatch())
        {
            cout<<_sql->lastError();
        }
    }
    _db->commit();
    cout<<"插入用时:"<<t.elapsed();

    return true;
}

执行时间大大减少!!!
在这里插入图片描述

SQLite是一个轻量级的关系型数据库管理系统,适合嵌入式应用。如果你想在SQLite循环执行带有参数的插入语句,你可以使用`sqlite3_exec()`函数配合一个循环来完成。以下是一个简单的示例,展示了如何创建一个循环插入一系列记录: ```cpp #include <sqlite3.h> #include <vector> #include <string> // 假设我们有一个数据结构或容器,存储要插入的数据 std::vector<std::pair<int, std::string>> data_to_insert = { {1, "Value1"}, {2, "Value2"}, // 更多数据... }; // SQLite3上下文 sqlite3* db; int rc; // 函数用于执行SQL(并处理结果) static int callback(void* data, int num_rows, char** row_data, char** col_names) { // 如果有错误,这里可以处理 if (num_rows != SQLITE_OK) { // 错误处理... return 0; } // ... return sqlite3_column_count(*row_data); } // 打开或连接到数据库(假设已经打开过了) rc = sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, 0, &db_error); // 插入数据的循环 for (const auto& entry : data_to_insert) { const char* insert_query = "INSERT INTO your_table (id, value) VALUES (?, ?)"; sqlite3_stmt* stmt; rc = sqlite3_prepare_v2(db, insert_query, -1, &stmt, NULL); if (rc == SQLITE_OK) { sqlite3_bind_int(stmt, 1, entry.first); sqlite3_bind_text(stmt, 2, entry.second.c_str(), entry.second.length(), SQLITE_TRANSIENT); rc = sqlite3_step(stmt); // 执行插入操作 if (rc != SQLITE_DONE) { // 处理错误... } sqlite3_finalize(stmt); // 关闭准备好的语句 } else { // 准备阶段错误处理... } } // 提交事务(如果所有插入都成功) if (rc == SQLITE_OK) { rc = sqlite3_exec(db, "COMMIT;", NULL, 0, &db_error); } else if (rc == SQLITE_BUSY) { // 如果因为并发导致忙,你可以选择重试、等待或回滚事务 // ... } // 最后记得关闭连接 sqlite3_close(db);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非西昂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值