SQLite BLOB与文件存储:如何选择?

发表时间: 2019-08-04 10:56

如果有一个大型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值。

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

  • 数据库页面大小为8192或16384,可为大型BLOB I / O提供最佳性能。
  • 对于小于100KB的BLOB,当BLOB直接存储在数据库文件中时,读取速度更快。对于大于100KB的BLOB,从单独文件读取的速度更快。

当然,这个结果可能因硬件,文件系统和操作系统而异。