Qt随手记:sqlite几百万行数据性能测试

环境:

Uos1042版本、cpu i7 8750H 内存16G 笔记本
Qt5.15、sqlite3
单表 19个字段

期望:

查询速度要快;更新较少,每天或几天更新一次,更新的时间恰当即可。

测试情况:

条件:测试过程涵盖产生数据时间、插入时间时间、是否内存时间。比如插入100万行数据的产生数据时间就有100万次for循环。并且表除了主键,没有其它索引。
插入100万行 40S. 每行有19个字段,数据库文件占225M
插入1000万行,1个小时没完成,测试程序卡死。占用内存90%。经过分析,其实1000万行数据在30分钟左右时就插入完毕。可能是内存不足,导致响应特别慢。数据库文件占空间2.5G。由于笔记本内存不足,接下来不再测试1000万行的情况。
插入300万行,122910ms,即123秒,其中产生数据的时间和释放数据内存的时间占了96秒。接着,第二次插入300万行,128910ms,即129秒。第三次插入300万行,125575ms,即126秒。cpu保持在47%、内存保持在36%,其中数据本身占的内存23%。
查询性能情况:
查询语句 select * from 表名 where cardid=‘4600331’
未建立索引的情况
1000万行查询1.5秒
建立索引后,1毫秒内
在两个字段上建立索引后,插入数据时间变长。插入300万行,122910ms,即123秒,其中产生数据的时间和释放数据内存的时间占了96秒。接着,第二次插入300万行,128910ms,即129秒。第三次插入300万行,290575ms,即290秒。第四次插入100万行,279031ms,即279秒。建立索引后1000万行数据占空间2.8G。
更新单行数据133ms。删除单行数据104ms。
注意:建立索引后,插入数据时间倍增。第一次插入300万行约2分钟,接着第二次插入300万行5分钟,第三次约7分钟。
上述性能测试结果已经满足当前的工作需要。

关键的测试源码

插入的代码

QSqlDatabase db;
QString addCmd = QString("INSERT INTO 表名(AJQY, AJTD,  XM,   XB,  MZ,   ZH,  ZJLX,  ZZ,  TXSJ, SFYJ, YJDJ, YJNR,  ZQMJ,  YJSJ,   CZMJ,  CZSJ , ZJIMAGEPATH, PZIMAGEPATH) \
                                      VALUES(?, ?, ?, ?, ?, ?, ?,  ?, ?, ?, ?,  ?, ?, ?, ?, ?, ?,?)");
db.transaction();
    QSqlQuery query(db);
    query.prepare(addCmd);//有助于加快解析sql语句
    QVariantList v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,v17,v18,v19;
    for(auto item : piList)
    {
        v2 << item->AJQY1;
        v3 << item->AJTD2;
        v4 << item->XM3;
        v5 << item->XB4;
        v6 << item->MZ5;
        v7 << item->ZH6;
        v8 << item->ZJLX7;
        v9 << item->ZZ8;
        v10 << item->TXSJ9;
        v11 << item->SFYJ10;
        v12 << item->YJDJ11;
        v13 << item->YJNR12;
        v14 << item->ZQMJ14;
        v15 << item->YJSJ13;
        v16 << item->CZMJ15;
        v17 << item->CZSJ16;
        v18 << item->ZJIMAGEPATH17;
        v19 << item->PZIMAGEPATH18;
    }
    query.addBindValue(v2);
    query.addBindValue(v3);
    query.addBindValue(v4);
    query.addBindValue(v5);
    query.addBindValue(v6);
    query.addBindValue(v7);
    query.addBindValue(v8);
    query.addBindValue(v9);
    query.addBindValue(v10);
    query.addBindValue(v11);
    query.addBindValue(v12);
    query.addBindValue(v13);
    query.addBindValue(v14);
    query.addBindValue(v15);
    query.addBindValue(v16);
    query.addBindValue(v17);
    query.addBindValue(v18);
    query.addBindValue(v19);

    if(!query.execBatch())
    {
	 db.commit();
       
        return false;
    }

    db.commit();

    query.clear();

查询、删除和更新
SELECT * FROM 表名 WHERE ZH=‘46000119901050342456486’
UPDATE 表名 SET XM=‘李四’ WHERE ZH=‘11000119901119162999970’
DELETE FROM 表名 WHERE ZH=‘11000119901119162999970’

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值