Qt 使用SQLite的性能优化的亿点点记录

举报
DreamLife 发表于 2022/08/05 23:21:48 2022/08/05
【摘要】 Qt 使用SQLite的性能优化的亿点点记录 文章目录 Qt 使用SQLite的性能优化的亿点点记录摘要第一版本出现问题 第二版本第三版本 关键字: 事务模式、 执行准备、...
头图

Qt 使用SQLite的性能优化的亿点点记录


关键字: 事务模式 执行准备 Qt SQL SQLite

摘要

今天又是美好的一天,因为要发工资了,哈哈哈;但是,活还得干。

基本需求呢,就是我会实时读取数据,玩了把它写入到数据库中,本来这个时间序列数据应该整个正式的东西来存储,但是呢,我不会,正好手头就有现成的SQLite数据库可以使用,所以就用了。下面是各种记录的坑。

第一版本

这个版本呢,没有做任何优化处理,就是普通的数据库插入。

代码非常简单,就是一句话,如下

sql_query.exec(QString("insert into %1(Date0,Data1,Data2) values ('%2', '%3', '%4')").arg(gPatientName).arg(0).arg(jsonData1).arg(jsonData2));

  
 
  • 1

出现问题

这里要不就是啥事都得实践了,这么写在语法上没有任何问题,但是最后结果却不是自己想要的。我理论上每秒钟应该会插入 8000次数据,但是在我辛苦跑了两小时(为啥是两小时,因为我想摸鱼,哈哈哈),发现数据并没有达到我的需求。所以在这里就开始找问题,就有了下面这个网址,要么所心情好,啥都好了,没想到这么快就有了解决办法。

https://www.cnblogs.com/sinpoo/p/15970396.html

每一个人创作都不容易,这里还是推荐大家去看看作者写的,非常牛逼。

优化方法 无优化 关闭写同步 开启事务 执行准备 内存模式
每秒插入 13条 1321条 5万条 213万条 215万条

所以就会出现了第二个版本

第二版本

​ 开启事务模式,这个就够我用了。其实还可以使用执行准备模式,但是要加好多条代码,所以就放弃了,如果需求,就可以在搞上执行准备。

void Turing_USB_DataAnalysis::slot_insertDB()
{
    if(sqlCount == 0)
        sql_query.exec("BEGIN TRANSACTION;");                                                                                                               // 开启数据库事物
    sql_query.exec(QString("insert into %1(Date0,Data1,Data2) values ('%2', '%3', '%4')").arg(gPatientName).arg(0).arg(jsonData1).arg(jsonData2));
    sqlCount++;
    if(sqlCount == 2000)
    {
        sql_query.exec("END TRANSACTION;");                                                                                                                 // 真正的更新数据到数据库
        sqlCount = 0;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

第三版本

这里就可以开启执行准备了,执行准备Qt写实帮助我们实现了的,https://www.cnblogs.com/sinpoo/p/15970396.html作者用的是直接调用的方式,我们还是可以用Qt的QSqlQuery来实现。示例如下,这里就直接搬运官方文档了,由于暂时我用不到,所以就不考虑实现了。

bool QSqlQuery::prepare(const QString &query)
Prepares the SQL query query for execution. Returns true if the query is prepared successfully; otherwise returns false.
The query may contain placeholders for binding values. Both Oracle style colon-name (e.g., :surname), and ODBC style (?) placeholders are supported; but they cannot be mixed in the same query. See the Detailed Description for examples.
Portability notes: Some databases choose to delay preparing a query until it is executed the first time. In this case, preparing a syntactically wrong query succeeds, but every consecutive exec() will fail. When the database does not support named placeholders directly, the placeholder can only contain characters in the range [a-zA-Z0-9_].
For SQLite, the query string can contain only one statement at a time. If more than one statement is given, the function returns false.
Example:
QSqlQuery query;
query.prepare(“INSERT INTO person (id, forename, surname) "
“VALUES (:id, :forename, :surname)”);
query.bindValue(”:id", 1001);
query.bindValue(“:forename”, “Bart”);
query.bindValue(“:surname”, “Simpson”);
query.exec();
See also exec(), bindValue(), and addBindValue().


博客签名2021

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/126172009

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。