小。速度很快。可靠。
选择任意三个选项。
SQLite中的内部BLOB与外部BLOB
如果你有一个包含大型BLOB的数据库,你的读取性能会更好吗当您存储完整BLOB内容直接存储在数据库中,还是存储每个BLOB更快在一个单独的文件中,并将相应的文件名存储在数据库中?
为了回答这个问题,我们运行了49个不同BLOB大小的测试用例Linux工作站上的SQLite页面大小(Ubuntu大约2011年快速SATA磁盘上的Ext4文件系统)。对于每个测试用例,都会创建一个包含100MB BLOB的数据库内容。BLOB的大小从10KB到1MB不等。数字的BLOB有所不同,以便将BLOB的总内容保持在100MB左右。(因此,1MB大小为100 BLOB,10K大小为10000 BLOB以此类推。)数据库版本3.7.8使用(2011-09-19)。
更新:SQLite 3.19.0版的新测量(2017-05-22)表明SQLite速度提高35%的直接磁盘I/O读取和写入10KB blob。
下面的矩阵显示了读取存储在单独文件中的BLOB所需的时间除以读取完全存储在数据库中的BLOB所需的时间。因此,对于大于1.0的数字,直接存储BLOB会更快在数据库中。对于小于1.0的数字,存储BLOB更快在单独的文件中。
在每种情况下,都会调整寻呼机缓存大小以保持缓存容量约为2MB。例如,一个2000页缓存用于1024字节的页面31页缓存用于65536字节的页面。BLOB值按随机顺序读取。
数据库页面大小 | BLOB大小 |
10公里 | 2万 | 5万 | 10万 | 20万 | 50万 | 100万 |
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 |
我们从上面的矩阵推导出以下经验法则:
当然,根据硬件、文件系统、,和操作系统。在目标硬件上双击这些数字在进行特定设计之前。