18

我在某处提到过这样做emit(key, doc)会增加索引构建所需的时间(或类似的东西)。

emit(key, null)它有什么优点吗,有什么理由不总是这样做include_docs = true吗?

4

2 回答 2

23

是的,它会增加索引的大小,因为在这些情况下 CouchDB 会有效地复制整个文档。对于可以的情况,请使用include_docs=true.

但是,在使用 wiki 中提到的这个时,需要注意一个竞争条件。在读取视图数据和获取文档之间的时间期间,所述文档可能已更改(或已删除,在这种情况下_deleted将是true)。这记录“查询选项”下。

于 2009-09-26T03:18:58.267 回答
4

这是一个经典的时间/空间权衡。

将文档数据发送到索引中会增加磁盘上索引文件的大​​小,因为 CouchDB 将发送的数据直接包含在索引文件中。但是,这意味着,在查询数据时,CouchDB 可以直接从磁盘上的索引文件中流式传输内容。这显然是相当快的。

相反,依赖include_docs=true会减小磁盘索引的大小,这是真的。但是,在查询时,CouchDB 必须为每个返回的行执行文档读取。这基本上涉及从主数据文件中随机查找文档,这意味着返回数据的成本和时间显着增加。

虽然少量文档的查询时间差很慢,但它会在应用程序的每次调用中累加。因此,对我来说,将文档中需要的字段发送到索引中通常是正确的选择——磁盘很便宜,用户的注意力不那么重要。这与在关系数据库中使用覆盖索引大体相似,这是另一个被广泛响应的建议。

我对此进行了完全不科学的测试,以了解其中的区别。include_docs=true我发现,与将文档直接发送到索引本身的视图相比,使用从视图中读取 100,000 个文档时,响应时间增加了大约 8 倍,CPU 增加了 50% 。

于 2017-02-04T19:27:55.643 回答