最近有個涉及到對sqlite操作的專案,由於對sqlite資料庫進行頻繁地「寫,讀,查詢」的操作,但是由於查詢這塊每次要取出大概10w條,這樣的耗時就非常大。因為sqlite的資料庫的操作需要加鎖(寫單獨乙個執行緒,讀又是乙個執行緒,查詢又是另乙個執行緒),這樣的話就存在3個執行緒搶一把鎖,但是因為查詢的資料量又比較多,這時候查詢的話就耗時很嚴重的了,這間接會影響到寫入或者刪除的效能。
因此網上查了資料,從sqlite的這些引數來入手:synchronous,default_cache_size,page_size,mmap_size,journal_mode這幾個引數來更改。**如下:
在sqlconnection.cpp裡面的 csqlconnection::open這個函式裡面的sqlite3_exec 對應的引數更改成如下:
bool sqlite_sqlconnection_nsamespace::csqlconnection::open(const char* szdatabase)
sqlite3_exec(m_pconnect, "pragma synchronous = off;", 0, 0, &zerrmsg);
sqlite3_exec(m_pconnect, "pragma default_cache_size = 8000;", 0, 0, &zerrmsg);
sqlite3_exec(m_pconnect, "pragma page_size = 16384;", 0, 0, &zerrmsg);
sqlite3_exec(m_pconnect, "pragma mmap_size = 4294967296;", 0, 0, &zerrmsg);
sqlite3_exec(m_pconnect, "pragma journal_mode = wal;", 0, 0, &zerrmsg);
//......................
接著,得再把sqlite這使用的資料庫檔案match_rpt.db的資料字段加上索引,加上索引之後 ,再進行寫入的壓測。
注意:如果不加索引,效能和csqlconnection::open這函式沒有改之前 是一樣的。下面是對進行大量壓測的**: }}
用上面的這段**測試(壓測300w條資料),match_rpt.db加了索引的話就有4000-8000條的資料,但是不加索引 的話,就300-500條左右每秒;這些資料對應的就是sqlite的效能。。。
附註writetosqlite的實現:
#define write_mt "insert into match_queue(phone,sendtime,productid,spmsgid,defeated)values('%s',%d,%d,'%s',%d)"
void writetosqlite(string &strphone, int productid, string &spmsgid, int ndefeated=0)}}
SQLite效能優化
最近做了乙個專案,在系統啟動時會更新幾千條資料,剛開始就使用最簡單的寫法,直接的insert,delete,導致這個更新過程進行了300多秒,後來經查得知在處理大量資料的時候新增上事務管理,會大大的提高效能,隨後就查閱資料如何來新增事務管理。這ios的sqlite和android上面的語法真是相差很...
sqlite 效能優化
比如 空間釋放 磁碟同步 cache大小等。不要開啟。前文提高了,vacuum的效率非常低!pragma auto vacuum pragma auto vacuum 0 1 查詢或設定資料庫的auto vacuum標記。正常情況下,當提交乙個從資料庫中刪除資料的事務時,資料庫檔案不改變大小。未使用...
sqlite效能提公升
常規連線sqlite字串為 data source db.db version 3 用上述字串連線sqlite,然後用 system.data.sqlite 訪問資料庫時發現有下述幾個問題 往表中插入一條資料時大約耗時100ms 無論表中資料是否很多 這在插入大量資料時會等待很長時間 多執行緒訪問資...