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’