Sqlite参考手册
其他 | Miscellaneous
Internal Versus External BLOBs
如果您拥有一个大型BLOB数据库,那么当您将完整的BLOB内容直接存储在数据库中时,还是将每个BLOB存储在单独的文件中并将相应的文件名存储在数据库中时,您是否获得了更好的读取性能?
为了回答这个问题,我们在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左右。例如,对于1024字节页面使用2000页面高速缓存,对于65536字节页面使用31页面高速缓存。BLOB值是以随机顺序读取的。
Database Page Size |
BLOB size |
||||||
---|---|---|---|---|---|---|---|
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,从单独的文件读取速度更快。
当然,您的里程可能会因硬件,文件系统和操作系统而异。在进行特定设计之前,请仔细检查目标硬件上的这些数字。
SQLite在公共领域。
其他 | Miscellaneous相关
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来
主页 | https://sqlite.org/ |
源码 | https://www.sqlite.org/src/ |
发布版本 | 3.21.0 |