如果您有一個大型 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 大小 | ||||||
---|---|---|---|---|---|---|---|
10k | 20k | 50k | 100k | 200k | 500k | 1m | |
1024 | 1.535 | 1.020 | 0.608 | 0.456 | 0.330 | 0.247 | 0.233 |
2048 | 2.004 | 1.437 | 0.870 | 0.636 | 0.483 | 0.372 | 0.340 |
4096 | 2.261 | 1.886 | 1.173 | 0.890 | 0.701 | 0.526 | 0.487 |
8192 | 2.240 | 1.866 | 1.334 | 1.035 | 0.830 | 0.625 | 0.720 |
16384 | 2.439 | 1.757 | 1.292 | 1.023 | 0.829 | 0.820 | 0.598 |
32768 | 1.878 | 1.843 | 1.296 | 0.981 | 0.976 | 0.675 | 0.613 |
65536 | 1.256 | 1.255 | 1.339 | 0.983 | 0.769 | 0.687 | 0.609 |
我們從上方的矩陣中推論出下列經驗法則
8192 或 16384 的資料庫頁面大小可提供大型 BLOB I/O 的最佳效能。
對於小於 100KB 的 BLOB,當 BLOB 直接儲存在資料庫檔案中時,讀取會比較快。對於大於 100KB 的 BLOB,從個別檔案中讀取會比較快。
當然,您的里程數可能會因硬體、檔案系統和作業系統而異。在承諾特定設計之前,請在目標硬體上仔細檢查這些數字。