詳解Qt 中如何提高Sqlite讀寫(xiě)速度
Qt 中如何提高Sqlite讀寫(xiě)速度 是本文要介紹的內(nèi)容,SQLite數(shù)據(jù)庫(kù)本質(zhì)上來(lái)講就是一個(gè)磁盤(pán)上的文件,所以一切的數(shù)據(jù)庫(kù)操作其實(shí)都會(huì)轉(zhuǎn)化為對(duì)文件的操作,而頻繁的文件操作將會(huì)是一個(gè)很好時(shí)的過(guò)程,會(huì)極大地影響數(shù)據(jù)庫(kù)存取的速度。例如:向數(shù)據(jù)庫(kù)中插入100萬(wàn)條數(shù)據(jù),在默認(rèn)的情況下如果僅僅是執(zhí)行query.exec("insert into DataBase(......) values(......)");就會(huì)打開(kāi)和關(guān)閉文件100萬(wàn)次,所以速度當(dāng)然會(huì)很慢。SQLite數(shù)據(jù)庫(kù)是支持事務(wù)操作的,于是我們就可以通過(guò)事務(wù)來(lái)提高數(shù)據(jù)庫(kù)的讀寫(xiě)速度。事務(wù)的基本原理是:數(shù)據(jù)庫(kù)管理系統(tǒng)首先會(huì)把要執(zhí)行的sql語(yǔ)句存儲(chǔ)到內(nèi)存當(dāng)中,只有當(dāng)commit()的時(shí)候才一次性全部執(zhí)行所有內(nèi)存中的數(shù)據(jù)庫(kù)。下面是一個(gè)簡(jiǎn)單的QT sqlite數(shù)據(jù)庫(kù)事務(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;
- // 開(kāi)始啟動(dòng)事務(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ù),這個(gè)時(shí)候才是真正打開(kāi)文件執(zhí)行SQL語(yǔ)句的時(shí)候
- db_sqlite.commit();
- cout<<"10000條數(shù)據(jù)耗時(shí):"<<tmpTime.elapsed()<<"ms"<<endl;
- }
其實(shí)QT 操作sqlite數(shù)據(jù)庫(kù)增加事務(wù)的功能就是上面例子中藍(lán)色字體標(biāo)出的兩句話,如果去掉這兩句話,程序又會(huì)還原為:打開(kāi)文件——執(zhí)行query.exec(...)——關(guān)閉文件。大家可以試一下,添加這兩句即增加事務(wù)以后數(shù)據(jù)插入的速度明顯提高很多。
在入庫(kù)和更新過(guò)程中按照數(shù)據(jù)庫(kù)事務(wù)的思想進(jìn)行設(shè)計(jì):SQLite執(zhí)行入庫(kù)、更新操作的方式是,sql語(yǔ)句執(zhí)行對(duì)象句柄調(diào)用庫(kù)函數(shù)打開(kāi)文件、調(diào)用函數(shù)執(zhí)行sql語(yǔ)句、關(guān)閉文件。這樣的執(zhí)行方式對(duì)于數(shù)量級(jí)別超大的文件的弊端就是每次執(zhí)行sql語(yǔ)句的時(shí)候都要打開(kāi)文件(假設(shè)***數(shù)量級(jí)的數(shù)據(jù),就要打開(kāi)和關(guān)閉文件百萬(wàn)次),對(duì)于數(shù)據(jù)庫(kù)的入庫(kù)和更新操作時(shí)間主要都浪費(fèi)到了文件的打開(kāi)和關(guān)閉操作上,所以這里增加事務(wù)以解決該問(wèn)題。
小結(jié):關(guān)于詳解Qt 中如何提高Sqlite讀寫(xiě)速度的內(nèi)容介紹完了,希望本文對(duì)你有所幫助。更多關(guān)于數(shù)據(jù)庫(kù)的內(nèi)容請(qǐng)參考編輯推薦。