当我压缩CouchDB数据库时,实际发生了什么?

当我压缩CouchDB数据库时,实际发生了什么?,couchdb,Couchdb,我注意到,每次插入一些东西后压缩CouchDB实例时,其大小都会下降很多(有时甚至下降到20%) 我没有删除或修改任何数据,我所做的基本上就是插入新记录,压缩,然后减小大小 压缩数据库时实际发生了什么?它是否以某种方式压缩了数据?或者是因为每一条新记录都带有一些垃圾,这些垃圾随后会被压缩文件删除?CouchDB使用仅附加的文件格式。代码永远不会执行fseek(3)。从开头开始的任何截断的.couch文件都是有效的数据库文件。(CouchDB从末尾向后扫描以找到它的“头”) 这种体系结构的成本是每

我注意到,每次插入一些东西后压缩CouchDB实例时,其大小都会下降很多(有时甚至下降到20%)

我没有删除或修改任何数据,我所做的基本上就是插入新记录,压缩,然后减小大小


压缩数据库时实际发生了什么?它是否以某种方式压缩了数据?或者是因为每一条新记录都带有一些垃圾,这些垃圾随后会被压缩文件删除?

CouchDB使用仅附加的文件格式。代码永远不会执行
fseek(3)
。从开头开始的任何截断的
.couch
文件都是有效的数据库文件。(CouchDB从末尾向后扫描以找到它的“头”)

这种体系结构的成本是每次进行更改时都要写入大量重复数据。基本上,coach会将新数据写入文件的末尾,然后写入将该数据合并到数据树中所需的所有元数据更新,并写入一个新的头以永久提交所有这些数据

因此,您会得到大量重复的元数据(内部b树节点等),更不用说在
.coach
文件中积累的旧文档数据了。再一次,这是为永不覆盖任何数据的防弹技术买单


压缩仅扫描旧.coach文件中的相关数据,并仅将其写入新的.coach文件。b-树是平衡的,旧文档不再存在。它很好而且干净。

即使您只是插入数据,自上次查询以来,每次数据发生更改时,您的视图都会更新,这可能会导致大量空间浪费。不过这只是猜测。我的记录是将一个300GB的文件压缩到6MB。(它有一个非常高的更新率相同的几个文件。)哇,这是很多。。。这么大的分贝需要多长时间?只需要片刻。CouchDB从较大的文件中挖掘出“实时”数据,将该数据(仅此)写入新文件,并重命名该文件,瞧!