在对数据库操作时,提升数据库的速率是很重要的,要不然数据量太大的话,只是操作数据库就会增加时间成本,因此,提升速率势在必行。
1.问:SQLite数据库是什么?
答:SQLite是一款轻型的数据库,他设计的目标是为了嵌入式,由于占用空间非常低,因此大量的应用于嵌入式设备中。
更直白的来说,SQLite数据库是一个存在于我们某个磁盘的文件,普通的使用,我们是在不断地打开文件–>文件操作–>关闭文件的循环中浪费时间,
如果有1千万条数据等待插入数据库,那么我们这样的操作会花好长时间,因此我们需要寻找一种方法提升读写速度。
假设:既然数据库是一个文件,那么我们为什么不能打开数据库后一次性将数据全部插入进去再关闭数据库呢?
而Qt提供的事物处理函数正好解决了这种难题,具体看下面代码
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QTime>
#include <QDebug>
void MainWindow::on_pushButton_clicked()
QSqlDatabase m_pDB = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");
m_pDB.setDatabaseName("myTest.db3");
m_pDB.open();
QSqlQuery query("", m_pDB);
QTime tmpTime;
QString sql = "create table T_test("
"id int(4),"
"name varchar(20)"
")";
bool nRet = query.exec(sql);
if( nRet )
qDebug()<<"create table success";
m_pDB.transaction();
tmpTime.start();
for(int i = 0; i<100000; i++)
bsuccess = query.exec("insert into T_test(id,name) values(2,'zhang')");
m_pDB.commit();
qDebug()<<"10000条数据耗时:"<<tmpTime.elapsed()<<"ms"<<endl;
QTime testTime;
tmpTime.start();
for(int i = 0; i<1000; i++)
bsuccess = query.exec("insert into T_test(id,name) values(3,'wang')");
qDebug()<<"1000条数据耗时:"<<testTime.elapsed()<<"ms"<<endl;
100000条数据耗时: 1382 ms —–>这是使用事物处理函数插入100000条数据所耗的时间
1000条数据耗时: 4447 ms —–>这是未使用事物处理函数插入1000条数据所耗的时间
对比一下,提升速度不是一般的高
查找数据的时候可以使用联合查询
select T_FileNext.* from T_FileNext where not exists(select * from T_FileLast where T_FileNext.FileName=T_FileLast.FileName and T_FileNext.FilePath=T_FileLast.FilePath)
使用这条SQL语句,当两张表里面有同样的4万条数据时,如果使用普通的查找所花费的时间大约是20min,而当使用联合查找是大概需要几十秒到一分钟时间
CREATE INDEX index_name ON table_name (FileName,FilePath)
当然两张表都要创建联合索引,具体的可以百度一下用法
单例模式(Singleton Pattern)是 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
> 通常开发过程中为了方便,就将软件的配置参数保存到sqlite数据库中,整个软件使用一个Sqlite数据库,就可以使用单例模式实现相关功能。
Qt在操作大量数据执行插入操作时,推荐使用事务
1.SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec(“insert into DataBase(……) values(……)”);就会打开和关闭...
在程序开发过程中,开发者总是想尽可能的充分利用计算机的硬件性能来提升程序的执行效率。为了达到这个目标我们会尽可能多的引入多线程来提升程序的并发性能。在QT程序中我们也可以通过引入多线程来提升程序的执行效率,但是在引入多线程的时候,要对项目架构进行严格的设计,避免出现死锁、僵尸线程甚至卡死界面的情况。
包含线程池的QT项目的一般架构如下图所示:
JobWidget对象存在于UI线程中,负责计算结果呈现和与用户的交互操作。
JobManager对象存在于JobManager线程中,该线程负责计算任务的
Qt 中如何提高Sqlite读写速度 是本文要介绍的内容,SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec("insert
into DataBase(......) values(.....
SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec("insert into DataBase(......) values(......)");就会打开和关闭文件100万次,所以速度当然会很慢。S
bool HydrologicDataDisplay::updataquerymodel()
QSqlQueryModel *Model = new QSqlQueryModel;
QString selectfromtable =
I'm working on a very simple small application which will be using Qt/SQLite. Sometimes the application will be accessing shared SQLite databases from multiple computers around the office.Is there a w...
今天又是美好的一天,因为要发工资了,哈哈哈;但是,活还得干。基本需求呢,就是我会实时读取数据,玩了把它写入到数据库中,本来这个时间序列数据应该整个正式的东西来存储,但是呢,我不会,正好手头就有现成的SQLite数据库可以使用,所以就用了。下面是各种记录的坑。......