詳解Qt 中如何提高Sqlite讀寫速度
Qt 中如何提高Sqlite讀寫速度 是本文要介紹的內(nèi)容,SQLite數(shù)據(jù)庫本質(zhì)上來講就是一個磁盤上的文件,所以一切的數(shù)據(jù)庫操作其實都會轉(zhuǎn)化為對文件的操作,而頻繁的文件操作將會是一個很好時的過程,會極大地影響數(shù)據(jù)庫存取的速度。例如:向數(shù)據(jù)庫中插入100萬條數(shù)據(jù),在默認的情況下如果僅僅是執(zhí)行query.exec("insert into DataBase(......) values(......)");就會打開和關(guān)閉文件100萬次,所以速度當然會很慢。SQLite數(shù)據(jù)庫是支持事務(wù)操作的,于是我們就可以通過事務(wù)來提高數(shù)據(jù)庫的讀寫速度。事務(wù)的基本原理是:數(shù)據(jù)庫管理系統(tǒng)首先會把要執(zhí)行的sql語句存儲到內(nèi)存當中,只有當commit()的時候才一次性全部執(zhí)行所有內(nèi)存中的數(shù)據(jù)庫。下面是一個簡單的QT sqlite數(shù)據(jù)庫事務(wù)的例子:
- #include <QtCore/QCoreApplication>
- #include <QtSql>
- #include <iostream>
- using namespace std;
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- QSqlDatabase db_sqlite = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");
- db_sqlite.setDatabaseName("SQLiteDB.db3");
- db_sqlite.open();
- QSqlQuery query("", db_sqlite);
- bool bsuccess = false;
- QTime tmpTime;
- // 開始啟動事務(wù)
- db_sqlite.transaction();
- tmpTime.start();
- for(int i = 0; i<100000; i++)
- {
- bsuccess = query.exec("insert into DataBase(D_1,D_2,D_3,D_4,D_5) values('TT','TT','TT','TT','TT')");
- if (!bsuccess)
- {
- cout<<"Error occur"<<endl;
- break;
- }
- }
- // 提交事務(wù),這個時候才是真正打開文件執(zhí)行SQL語句的時候
- db_sqlite.commit();
- cout<<"10000條數(shù)據(jù)耗時:"<<tmpTime.elapsed()<<"ms"<<endl;
- }
其實QT 操作sqlite數(shù)據(jù)庫增加事務(wù)的功能就是上面例子中藍色字體標出的兩句話,如果去掉這兩句話,程序又會還原為:打開文件——執(zhí)行query.exec(...)——關(guān)閉文件。大家可以試一下,添加這兩句即增加事務(wù)以后數(shù)據(jù)插入的速度明顯提高很多。
在入庫和更新過程中按照數(shù)據(jù)庫事務(wù)的思想進行設(shè)計:SQLite執(zhí)行入庫、更新操作的方式是,sql語句執(zhí)行對象句柄調(diào)用庫函數(shù)打開文件、調(diào)用函數(shù)執(zhí)行sql語句、關(guān)閉文件。這樣的執(zhí)行方式對于數(shù)量級別超大的文件的弊端就是每次執(zhí)行sql語句的時候都要打開文件(假設(shè)***數(shù)量級的數(shù)據(jù),就要打開和關(guān)閉文件百萬次),對于數(shù)據(jù)庫的入庫和更新操作時間主要都浪費到了文件的打開和關(guān)閉操作上,所以這里增加事務(wù)以解決該問題。
小結(jié):關(guān)于詳解Qt 中如何提高Sqlite讀寫速度的內(nèi)容介紹完了,希望本文對你有所幫助。更多關(guān)于數(shù)據(jù)庫的內(nèi)容請參考編輯推薦。