如果有一个大型BLOB数据库,那么当你将完整的BLOB内容直接存储在数据库中时,您是否可以获得更好的读取性能,或者将每个BLOB存储在单独的文件中并在数据库中只存储相应的文件名会更快?
为了解决这个问题,SQLite开发者在Linux工作站上运行了49个具有各种BLOB大小和SQLite页面大小的测试用例(Ubuntu大约在2011年,在快速SATA磁盘上使用Ext4文件系统)。对于每个测试用例,创建了一个包含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值。
我们从上面的矩阵中推导出以下经验法则:
当然,这个结果可能因硬件,文件系统和操作系统而异。