SQLite3效能優化

2021-06-28 18:21:22 字數 4171 閱讀 2145

sqlite3效能調整主要通過pragma指令來實現。

比如調整:空間釋放、磁碟同步、cache大小等。

一.空間釋放

1.如何查詢:

pragma auto_vacuum;

含義:查詢資料庫的auto-vacuum標記。

2.標記含義:

auto-vacuum標記的含義:

正常情況下,當提交乙個從資料庫中刪除資料的事務時,資料庫檔案不改變大小。未使用的檔案頁被標記並在以後的新增操作中再次使用。這種情況下使用vacuum命令釋放刪除得到的空間。但是vacuum的效率非常低!

3.如何設定:

pragma auto_vacuum = 0 | 1;

當開啟auto-vacuum,也就是執行pragma auto_vacuum=1;

當提交乙個從資料庫中刪除資料的事務時,資料庫檔案自動收縮, (vacuum命令在auto-vacuum開啟的資料庫中不起作用)。資料庫會在內部儲存一些資訊以便支援這一功能,這使得 資料庫檔案比不開啟該選項時稍微大一些。

4.注意事項:

只有在資料庫中未建任何表時才能改變auto-vacuum標記。試圖在已有表的情況下修改不會導致報錯。

5.建議:

不要開啟。也就是「pragma auto_vacuum = 0;」執行命令。

二.快取大小

1.如何查詢:

pragma cache_size;

查詢sqlite一次儲存在記憶體中的資料庫檔案頁數。

2.標記含義:

每頁使用約1.5k記憶體,預設的快取大小是2000. 若需要使用改變大量多行的update或delete命令,並且不介意sqlite使用更多的記憶體的話,可以增大快取以提高效能。

3.如何設定

pragma cache_size = number-of-pages;

修改sqlite一次儲存在記憶體中的資料庫檔案頁數。

4.注意事項:

當使用cache_size pragma改變快取大小時,改變僅對當前對話有效,當資料庫關閉重新開啟時快取大小恢復到預設大小。要想永久改變快取大小,使用default_cache_size pragma.

5.建議:

修改為8000,也就是執行命令「pragma cache_size =8000;」即可;

三.like運算子

pragma case_sensitive_like; 

pragma case_sensitive_like = 0 | 1;

標記含義:

like運算子的預設行為是忽略latin1字元的大小寫。因此在預設情況下'a' like 'a'的值為真。可以通過開啟 case_sensitive_like pragma來改變這一預設行為。當啟用case_sensitive_like,'a' like 'a'為假而'a' like 'a'依然為真。

1.注意事項:

sqlite3.6.22版本不支援。

2.建議:

開啟。也就是執行命令「pragma case_sensitive_like = 1;」命令。不然搜尋中文字串會出錯。

四.like運算子

pragma count_changes; 

pragma count_changes = 0 | 1;

查詢或更改count-changes標記。

正常情況下insert, update和delete語句不返回資料。

當開啟count-changes,以上語句返回一行含乙個整數值的資料——該語句插入,修改或刪除的行數。

1.注意事項:

返回的行數不包括由觸發器產生的插入,修改或刪除等改變的行數。

2.建議:

開啟,便於除錯。也就是執行「pragma count_changes = 1;」該命令。

五.頁面大小

pragma page_size; 

pragma page_size = bytes;

查詢或設定page-size值。

1.注意事項:

只有在未建立資料庫時才能設定page-size。頁面大小必須是2的整數倍且大於等於512小於等於8192。

上限可以通過在編譯時修改巨集定義sqlite_max_page_size的值來改變。上限的上限是32768。

六.磁碟同步

1.如何查詢:

pragma synchronous;

指令含義:查詢"synchronous"標記的設定,返回整數值;

2.如何設定:

pragma synchronous = full; (2) 

pragma synchronous = normal; (1) 

pragma synchronous = off; (0)

3.引數含義:

當synchronous設定為full (2), sqlite資料庫引擎在緊急時刻會暫停以確定資料已經寫入磁碟。這使系統崩潰或電源出問題時能確保資料庫在重起後不會損壞。full synchronous很安全但很慢。

當synchronous設定為normal, sqlite資料庫引擎在大部分緊急時刻會暫停,但不像full模式下那麼頻繁。 normal模式下有很小的機率(但不是不存在)發生電源故障導致資料庫損壞的情況。但實際上,在這種情況 下很可能你的硬碟已經不能使用,或者發生了其他的不可恢復的硬體錯誤。

設定為synchronous off (0)時,sqlite在傳遞資料給系統以後直接繼續而不暫停。若執行sqlite的應用程式崩潰, 資料不會損傷,但在系統崩潰或寫入資料時意外斷電的情況下資料庫可能會損壞。另一方面,在synchronous off時 一些操作可能會快50倍甚至更多。

在sqlite 2中,預設值為normal.而在3中修改為full。

4.建議:

如果有定期備份的機制,而且少量資料丟失可接受,用off。

七.記憶體模式

1.如何查詢:

pragma temp_store;

指令含義:查詢"temp_store"引數的設定;

2.如何設定:

pragma temp_store = default; (0) 

pragma temp_store = file; (1) 

pragma temp_store = memory; (2)

3.引數含義:

當temp_store設定為default (0),使用編譯時的c預處理巨集 temp_store來定義儲存臨時表和臨時索引的位置。

當設定為file (1),則存放於檔案中。temp_store_directorypragma 可用於指定存放該檔案的目錄。

當設定為memory (2),臨時表和索引則存放於記憶體中。

4.注意事項:

5.建議:

使用2,即記憶體模式。

附指令表集:

序號

指令

含義

預設值

1

auto_vacuum

空間釋放

0

2

cache_size

快取大小

2000

3

case_sensitive_like

like大小寫敏感

(注意:sqlite3.6.22不支援)

4

count_changes

變更行數

0

5

page_size

頁面大小

1024

6

synchronous

硬碟大小

2

7

temp_store;

記憶體模式

0

(end.)

使用sqlite3 模組操作sqlite3資料庫

python內建了sqlite3模組,可以操作流行的嵌入式資料庫sqlite3。如果看了我前面的使用 pymysql 操作mysql資料庫這篇文章就更簡單了。因為它們都遵循pep 249,所以操作方法幾乎相同。廢話就不多說了,直接看 吧。都差不多,首先匯入模組,然後建立連線,然後獲取游標物件,之後利...

MySQL和Sqlite3效能測試

測試條件 i5 4460 3.2g,普通機械硬碟。mysql 5.0.45 community nt,32bit,innodb引擎,innodb flush log at trx commit 0 sqlite3 synchronous off,lockingmode exclusive table...

MySQL和Sqlite3 效能測試對比

測試條件 i5 4460 3.2g,普通機械硬碟。mysql 5.0.45 community nt,32bit,innodb引擎,innodb flush log at trx commit 0 sqlite3 synchronous off,lockingmode exclusive table...