Small. Fast. Reliable.
Choose any three.

SQLite内部与外部BLOB

如果您有一个大型BLOB的数据库,那么将完整的BLOB内容直接存储在数据库中时,会获得更好的读取性能吗?还是将每个BLOB存储在单独的文件中并在数据库中仅存储相应的文件名会更快吗?

为了回答这个问题,我们在Linux工作站(Ubuntu大约在2011年,快速SATA磁盘上使用Ext4文件系统)上运行了49个具有各种BLOB大小和SQLite页面大小的测试用例。对于每个测试用例,都会创建一个包含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左右。例如,一个2000页的高速缓存用于1024个字节的页面,而31页的高速缓存用于65536个字节的页面。BLOB值以随机顺序读取。

数据库页面大小BLOB大小
10k20k50k100k20万50万1m
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

我们从上面的矩阵中得出以下经验法则:

当然,您的里程可能会因硬件,文件系统和操作系统而异。在进行特定设计之前,请在目标硬件上仔细检查这些数字。