SQLITE3大量简单数据简单写测试

本文参考sqlite性能优化之路-配置优化进行尝试

结果前置

无索引,平均每62W/s的简单写入
简单ID自增索引,平均每51W/s的简单写入

本机配置

在这里插入图片描述
在这里插入图片描述

维护索引也需要时间,首先无索引测试

简单代码

#pragma once

#include <QCoreApplication>
#include <QDebug>
#include <QElapsedTimer>
#include <QRandomGenerator>
#include <QSqlDatabase>
#include <QSqlDriver>
#include <QSqlQuery>

class SqliteHelper : public QObject {
    Q_OBJECT

public:
    SqliteHelper(QObject* parent = nullptr);
    ~SqliteHelper();

public:
    QSqlDatabase db;
    size_t sum = 0;
    bool create()
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        QString dbPath = QCoreApplication::applicationDirPath() + "/test.db";
        // QString dbPath = ":memory:";
        db.setDatabaseName(dbPath);
        if (!db.open()) {
            qWarning() << "数据库创建失败";
        }
        QSqlQuery query(db);
        // 创建Point表:x,y,z,rx,ry,rz,dx,dy,dz,xl,yl,zl->类型浮点数
        QString sql = "create table  Point ("
                      "x float,"
                      "y float,"
                      "z float,"
                      "rx float,"
                      "ry float,"
                      "rz float,"
                      "dx float,"
                      "dy float,"
                      "dz float,"
                      "xl float,"
                      "yl float,"
                      "zl float)";

        this->db.exec(sql);
        // 写同步
        this->db.exec("PRAGMA synchronous = normal");
        // 日志
        this->db.exec("PRAGMA journal_mode = WAL");
        // mmap最大3000MB
        this->db.exec("PRAGMA mmap_size = 3145728000");
        // 内存缓存最大10GB
        this->db.exec("PRAGMA cache_size = 10000000");
        // 优先内存临时文件
        this->db.exec("PRAGMA temp_store = memory");
        // 页面大小
        this->db.exec("PRAGMA page_size = 3276800");
        return true;
    }

    // 生成随机数据
    QVariantList buildRandomData(size_t count)
    {
        QVariantList list;
        QRandomGenerator it;
        list.reserve(count);
        for (size_t i = 0; i < count; i++) {
            list.append(it.bounded(100));
        }
        return list;
    }

    bool insert(QVariantList list)
    {

        QElapsedTimer sqlReady;
        sqlReady.start();
        QSqlQuery query;
        query.prepare("insert into Point(x,y,z,rx,ry,rz,dx,dy,dz,xl,yl,zl) values(?,?,?,?,?,?,?,?,?,?,?,?)");
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        qInfo() << "sql准备时间:" << sqlReady.elapsed() << "毫秒";
        QElapsedTimer ElapsedTimer;
        ElapsedTimer.start();
        if (!this->db.transaction()) {
            return false;
        }
        query.execBatch();
        bool s = this->db.commit();
        if (s) {
            sum += list.size();
            qInfo() << QString("已插入%1条信息").arg(sum);
            qInfo() << "本次插入" << list.size() << "条信息,共耗时" << ElapsedTimer.elapsed() << "毫秒";
        } else {
            qInfo() << QString("插入失败");
        }
        return s;
    }
};

测试结果

在这里插入图片描述
平均每62W/s的简单写入

简单自增ID索引测试

简单代码

#pragma once

#include <QCoreApplication>
#include <QDebug>
#include <QElapsedTimer>
#include <QRandomGenerator>
#include <QSqlDatabase>
#include <QSqlDriver>
#include <QSqlQuery>

class SqliteHelper : public QObject {
    Q_OBJECT

public:
    SqliteHelper(QObject* parent = nullptr);
    ~SqliteHelper();

public:
    QSqlDatabase db;
    size_t sum = 0;
    bool create()
    {
        db = QSqlDatabase::addDatabase("QSQLITE");
        QString dbPath = QCoreApplication::applicationDirPath() + "/test.db";
        // QString dbPath = ":memory:";
        db.setDatabaseName(dbPath);
        if (!db.open()) {
            qWarning() << "数据库创建失败";
        }
        QSqlQuery query(db);
        // 创建Point表:x,y,z,rx,ry,rz,dx,dy,dz,xl,yl,zl->类型浮点数
        QString sql = "create table  Point ("
                      "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                      "x float,"
                      "y float,"
                      "z float,"
                      "rx float,"
                      "ry float,"
                      "rz float,"
                      "dx float,"
                      "dy float,"
                      "dz float,"
                      "xl float,"
                      "yl float,"
                      "zl float)";

        this->db.exec(sql);
        // 写同步
        this->db.exec("PRAGMA synchronous = normal");
        // 日志
        this->db.exec("PRAGMA journal_mode = WAL");
        // mmap最大3000MB
        this->db.exec("PRAGMA mmap_size = 3145728000");
        // 内存缓存最大10GB
        this->db.exec("PRAGMA cache_size = 10000000");
        // 优先内存临时文件
        this->db.exec("PRAGMA temp_store = memory");
        // 页面大小
        this->db.exec("PRAGMA page_size = 3276800");
        return true;
    }

    // 生成随机数据
    QVariantList buildRandomData(size_t count)
    {
        QVariantList list;
        QRandomGenerator it;
        list.reserve(count);
        for (size_t i = 0; i < count; i++) {
            list.append(it.bounded(100));
        }
        return list;
    }

    bool insert(QVariantList list)
    {

        QElapsedTimer sqlReady;
        sqlReady.start();
        QSqlQuery query;
        query.prepare("insert into Point(x,y,z,rx,ry,rz,dx,dy,dz,xl,yl,zl) values(?,?,?,?,?,?,?,?,?,?,?,?)");
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        query.addBindValue(list);
        qInfo() << "sql准备时间:" << sqlReady.elapsed() << "毫秒";
        QElapsedTimer ElapsedTimer;
        ElapsedTimer.start();
        if (!this->db.transaction()) {
            return false;
        }
        query.execBatch();
        bool s = this->db.commit();
        if (s) {
            sum += list.size();
            qInfo() << QString("已插入%1条信息").arg(sum);
            qInfo() << "本次插入" << list.size() << "条信息,共耗时" << ElapsedTimer.elapsed() << "毫秒";
        } else {
            qInfo() << QString("插入失败");
        }
        return s;
    }
};

测试结果

平均每51W/s的简单写入
在这里插入图片描述

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLite3 中,定期进行数据库优化可以提高性能和减少空间占用。以下是一些常用的定期优化方法: 1. VACUUM:SQLite3 中的 VACUUM 命令用于重新组织数据库文件并释放未使用的空间。执行 VACUUM 可以减小数据库文件的大小,并提高查询性能。可以根据需要定期执行 VACUUM 命令,例如当删除大量数据后或者数据库文件变得过大时。 2. ANALYZE:ANALYZE 命令用于收集统计信息,帮助 SQLite3 优化查询执行计划。执行 ANALYZE 可以更新数据库中的统计信息,从而提高查询性能。可以定期执行 ANALYZE 命令,例如当数据分布发生变化时或者查询性能下降时。 3. REINDEX:REINDEX 命令用于重新建立索引,帮助 SQLite3 优化索引结构。执行 REINDEX 可以修复索引损坏或者优化索引结构,从而提高查询性能。可以根据需要定期执行 REINDEX 命令,例如当索引损坏或者查询性能下降时。 4. 清理无效的临时表:在使用临时表进行查询时,SQLite3 会自动创建临时表并在查询结束后自动删除。然而,有时由于异常退出或其他原因,临时表可能没有被正确删除。定期清理无效的临时表可以减少空间占用和提高性能。 5. 合理设置缓存大小:SQLite3 使用缓存来提高查询性能。根据应用程序的需求和系统资源情况,合理设置缓存大小可以提高性能。可以根据实际情况调整 SQLite3 的缓存设置,例如通过 PRAGMA 命令设置缓存大小。 需要注意的是,定期优化数据库应该在合适的时机进行,并且需要根据实际情况进行调整和测试。优化的频率和方法可能因数据库大小、查询模式、系统资源等因素而异。在进行任何优化操作之前,建议先备份数据库以防意外发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值