小巧、快速、可靠。
任選三項。

SQLite 中的內部與外部 BLOB

如果您有一個大型 BLOB 資料庫,當您將完整的 BLOB 內容直接儲存在資料庫中時,讀取效能會更好,還是將每個 BLOB 儲存在個別檔案中,並僅將對應的檔名儲存在資料庫中會更快?

為了嘗試回答這個問題,我們在 Linux 工作站(2011 年左右的 Ubuntu,使用快速 SATA 磁碟上的 Ext4 檔案系統)上,針對各種 BLOB 大小和 SQLite 頁面大小執行了 49 個測試案例。對於每個測試案例,都會建立一個包含 100MB BLOB 內容的資料庫。BLOB 的大小從 10KB 到 1MB。BLOB 的數量會有所不同,以將總 BLOB 內容維持在約 100MB。(因此,1MB 大小為 100 個 BLOB,10K 大小為 10000 個 BLOB,依此類推。)使用 SQLite 版本 3.7.8(2011-09-19)。

更新:針對 SQLite 版本 3.19.0(2017-05-22)的新測量結果顯示,對於 10KB blob 的讀取和寫入,SQLite 的速度比直接磁碟 I/O 快約 35%

下方的矩陣顯示了儲存在個別檔案中的 BLOB 讀取時間除以完全儲存在資料庫中的 BLOB 讀取時間。因此,對於大於 1.0 的數字,直接將 BLOB 儲存在資料庫中會比較快。對於小於 1.0 的數字,將 BLOB 儲存在個別檔案中會比較快。

在每個案例中,都會調整分頁快取大小,以將快取記憶體量維持在約 2MB。例如,1024 位元組頁面使用 2000 頁快取,而 65536 位元組頁面使用 31 頁快取。BLOB 值以隨機順序讀取。

資料庫頁面大小BLOB 大小
10k20k50k100k200k500k1m
10241.5351.0200.6080.4560.3300.2470.233
20482.0041.4370.8700.6360.4830.3720.340
40962.2611.8861.1730.8900.7010.5260.487
81922.2401.8661.3341.0350.8300.6250.720
163842.4391.7571.2921.0230.8290.8200.598
327681.8781.8431.2960.9810.9760.6750.613
655361.2561.2551.3390.9830.7690.6870.609

我們從上方的矩陣中推論出下列經驗法則

當然,您的里程數可能會因硬體、檔案系統和作業系統而異。在承諾特定設計之前,請在目標硬體上仔細檢查這些數字。