2

我有一个 CouchDB 数据库,它主要存储文档附件。

文件在 db 中排序,URL 结构如下:/db-name/numeric-file-id/official-human-readable-file-name.ext

一份文件始终只有一个附件。今天我计算了所有文件的 md5 总和,似乎其中许多是重复的。

我想知道 couchdb 是否知道重复的附件并在内部仅存储某种指向文件的指针,并跟踪引用计数,或者只是按原样存储每个附件。

我的意思是,如果我将 5 个相同的 100MB 文件作为附件,数据库将使用 100MB 还是 500MB?

4

1 回答 1

5

我在 CouchDB 文档中也找不到这个问题的直接答案,所以我设计了一个简单的经验测试(使用 CouchDB 1.4):

实验:

我逐渐添加了 3 个文档,每个文档都有几个在文档之间相同的大(多 MB)附件。然后,我在每次插入文档后检查了生成的 db.couch 文件的磁盘大小。

结果:

db.couch 文件从 8MB 增加到 16MB,然后分别为第 1 个、第 2 个和第 3 个文档插入增加了 24MB。因此,CouchDB 似乎不会对不同文档上的相同附件进行重复数据删除。添加三个文档后手动压缩数据库对文件大小没有影响,因此某些后台维护过程也不太可能注意到/修复此问题。

鉴于以下三个观察结果,缺少附件重复数据删除是一个奇怪的遗漏:

  1. 作者非常关心如何有效地处理大型附件,因此他们添加了对存储附件的自动 gzip 压缩(对于那些具有指示某种文本内容的 MIME 类型的附件。)

  2. 添加附件会导致计算 MD5 摘要并将其与附件的元数据一起存储。

  3. CouchDB 似乎确实对仍在数据库中的同一文档的多个版本之间共享的相同附件进行了重复数据删除(可能是 MD5 摘要的一种用途)。

考虑到这些因素,令人惊讶的是,CouchDB 在这方面并没有更智能,因为这将是一个有价值且(可能)直接的优化。

于 2013-11-08T09:28:12.150 回答