關於sqlite3速度慢的原因解決方法

2021-09-11 08:38:45 字數 1614 閱讀 2233

在對sqlite3 insert into 等操作時速度比較慢。

原因是因為它每次插入資料都需要訪問一次磁碟,開啟磁碟的速度大家可想而知,如果對

資料庫進行大量的操作,那麼速度回很慢。

解決辦法用事務的形式提交:

因為我們開始事務後,進行的大量操作的語句都儲存在記憶體中,當提交時才全部寫入資料庫,此時,資料庫檔案也就只用開啟一次。

在進行大量的操作前使用如下語句:

rc = sqlite3_exec(db, "begin;", 0,0, &szerrmsg);

for (...)

rc = sqlite3_exec(db, "commit;", 0, 0,&szerrmsg);

這樣速度提高了近千倍。

看看執行結果,一條插入語句大概要100ms左右:

或者在open資料庫後面加上非同步設定。

sqlite3_exec(db,"pragma synchronous = off; ",0,0,0);

pragma synchronous;

pragma synchronous = full;(2)

pragma synchronous = normal;(1)

pragma synchronous = off;(0)

查詢或設定 synchronous 標誌。 第一種格式返回乙個整數,當 synchronous 為 full (2) 時, sqlite 資料庫引擎將會在重要的時刻暫停, 以保證在繼續執行之前資料確實已經寫到磁碟上去了。 這能保證在遇到作業系統崩潰可電源故障時, 重新啟動機器資料庫檔案不會被破壞。full 同步方式是非常安全的, 但也是很慢的。若 synchronous 設為 normal,則 sqlite 資料庫引擎將在大多數重要時刻暫停,但比在 full 模式要少。 在極少情況下,處理這種模式的資料庫檔案可能會由於「不是時候」 的電源故障而導致受損。但在實際應用中, 更有可有遭受到災難性的磁碟故障或其它無法恢復的硬體故障。 若將 synchronous 設為 off (0),那麼 sqlite 從作業系統取得資料後將會立即進行處理而不會暫停。 如果使用 sqlite 的應用程式崩潰,資料將是安全的。 但如果在資料寫入磁碟之前,作業系統宕機或機器斷電, 資料庫檔案可能會損壞。此外,在該模式下, 某些操作會比其它情況下快 50 倍。

實際上非同步模式下資料庫是用檔案記憶體對映的方式實現的,沒直接寫入磁碟,但可以在作業系統上的程序間共享資料,

即我在應用程式裡面寫資料庫,

然後我馬上用

sqlite developer檢視器讀取資料是可以讀取的,但用檔案管理器瀏覽資料庫磁碟檔案其大小沒有變化。只有當應用程式退出後(即使強制關閉程序),資料庫磁碟檔案大小才會改變。所以,這種情況只有當作業系統掛掉了,才會丟失資料。

試想,能否寫個定時把記憶體檔案的資料定時重新整理儲存到磁碟中,這樣減少系統崩潰而引發丟失資料的風險?我想應該是可以的吧。

還有些關於sqlite優化的介紹如:

影響網頁載入速度慢的原因

第一 dns網域名稱解析 當瀏覽器向伺服器發出請求後,首先會有dns解析的,從而把 url解析為具體的ip位址,在這一步驟,可以做很多任務作。例如許多小 都使 用的單線的ip,門戶 建設公司的許多 都是使用的電信單線的ip,可是當網通使用者開啟的時候,速度卻出奇的慢,這時候,我們可以採用雙線ip,電...

mysql查詢速度慢的原因 整理版

在以前的部落格中陸續記錄了有關查詢效率方面的文章。今天在整理一下,寫上自己的一些心得記錄如下 常見查詢慢的原因常見的話會有如下幾種 1 沒有索引或沒有用到索引。ps 索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b 樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始...

查詢速度慢的原因,如何優化查詢

頁面顯示資料一定要及時的呈現,否則會影響使用者體現.那麼導致頁面載入資料慢或者顯示滯後的原因又是什麼呢?原因分析 後台資料庫中資料過多,未做資料優化 資料請求 解析 展示處理不當 網路問題 提高資料庫查詢的速度方案 sql 查詢速度慢的原因有很多,常見的有以下幾種 1 沒有索引或者沒有用到索引 查詢...