我有一个CouchDB数据库,主要存储文档附件.
这些文件存储在db中,其URL结构如下:/db-name/numeric-file-id/official-human-readable-file-name.ext
一个文档始终只有一个附件.今天我已经计算了所有文件的md5总和,看起来很多都是重复的.
我想知道couchdb是否知道重复的附件,并且内部只存储某种指向文件的指针,并跟踪引用计数,或者只是按原样存储每个附件.
我的意思是,如果我把5个相同的100MB文件作为附件,数据库会使用100MB还是500MB?
小智 5
我也无法在CouchDB文档中找到这个问题的直接答案,所以我设计了一个简单的实证测试(使用CouchDB 1.4):
实验:
我逐步添加了3个文档,每个文档都有几个文档之间相同的大(多MB)附件.然后,我在每次插入文档后检查生成的db.couch文件的磁盘大小.
结果:
对于第1,第2和第3个文档插入,db.couch文件分别从8MB增加到16MB,然后增加到24MB.因此,CouchDB似乎不会在不同文档上对相同的附件进行重复数据删除.添加三个文档后手动压缩数据库使文件大小没有差异,因此一些后台维护过程也不太可能会注意到/解决此问题.
鉴于以下三个观察结果,这种缺乏附件重复数据删除是一个奇怪的遗漏:
作者对于有效处理大型附件非常关注,他们为存储的附件添加了自动gzip压缩(对于那些MIME类型指示某种文本内容的人).
添加附件会导致计算MD5摘要并将其与附件的元数据一起存储.
CouchDB似乎对数据库中仍然存在的同一文档的多个转速之间共享的相同附件进行了重复删除(可能是MD5摘要的一次使用).
鉴于这些因素,令人惊讶的是CouchDB在这方面并不是更加智能,因为它将是一个有价值的(可能)直接的优化.