在对数据库操作时,提升数据库的速率是很重要的,要不然数据量太大的话,只是操作数据库就会增加时间成本,因此,提升速率势在必行。
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')");
}
// 提交事务,这个时候才是真正打开文件执行SQL语句的时候
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)
当然两张表都要创建联合索引,具体的可以百度一下用法