CouchDB - 参数和视图 - 幕后发生了什么,是否比临时视图更快/更快?

时间:2011-04-08 19:37:16

标签: couchdb

考虑这三个文件......

[
    {
        _id: "...",
        _rev: "...",
        title: "Foo",
        body: "..."
    },
    {
        _id: "...",
        _rev: "...",
        title: "Bar",
        body: "..."
    },
    {
        _id: "...",
        _rev: "...",
        title: "Hello World!",
        body: "..."
    },
]

这个观点......

byTitle: {
    map: function (document)
    {
        emit(document.title, document);
    }
}

当我查询视图时,幕后会发生什么?...

GET /database/_design/posts/_view/byTitle?key="Foo"


我最近询问了一些关于观点的问题...关于我所说的“动态参数”的问题 ...基本上我想知道如何做等同于{{1 }}

所有答案都引导我使用临时视图,这些视图非常慢,不应该用于制作。所以我的第二个问题是...... 是按标题查询的上述方法,适合在生产中使用?或者我是否迫使CouchDB在性能方面做出无法形容的恐怖?...我基本上和使用临时视图一样吗?

2 个答案:

答案 0 :(得分:6)

我认为你误解了一些答案。您可以使用临时视图来测试各种map / reduce函数。如果您对代码感到满意,则应将其放入设计文档中并使用它进行查询。

临时视图很慢,因为为每个查询构建和删除了索引。将它放入设计文档中,告诉CouchDB不要删除索引并保持更新(这是在查询时完成的。)

所以

GET /database/_design/posts/_view/byTitle?key="Foo"

是按标题查询的最快方式,因为它已被编入索引。

作为旁注:您可以使用

byTitle: {
    map: function (document)
    {
        emit(document.title, null);
    }
}

query with include_docs=true以节省一些磁盘空间。

答案 1 :(得分:2)

为了回答你的问题,必须清除一些事情(我希望我能做好):

永久与临时观点: 永久视图和临时视图之间的区别在于,永久视图是永久存储的。

为了理解存储部分,您需要知道,CouchDB的存储引擎依赖于B + Tree,它提供了非常强大的索引功能,使我们能够在“对数摊销时间”中通过密钥查找该存储中的数据({ {3}})。

CouchDB以“仅附加”方式处理文档。这意味着它不像在最关系的DBMS中那样,表行中的单个值得到更新并发生锁定。如果文档被更新,它只是递增地设置一个新版本(_rev)并附加到存储。

当您创建永久视图时,在第一次查询时,对于数据库中的每个文档,将执行新视图,将该数据存储到该视图的新B +树文件中,从而为该视图提供新索引根据您在视图中定义的键聚合数据。

在更新由该视图处理的文档时,不需要重新计算整个永久视图,而只需要重新计算更新的文档。

现在你应该能够理解为什么临时视图适合在Futon中开发或测试,但是因为必须为所有文档计算新的,所以不推荐用于开发以外的任何其他文件。

反正。马塞洛是对的。如果您打算只传回完整的文档,建议使用“include_docs = true”进行查询。为什么?因为永久视图的B树只需要将复制的数据存储在索引键旁边。

@ Marcello-Nuccio我不确定虽然说动态视图没有索引是否正确?据我所知,他们有一个索引,但它没有任何意义,因为它们是在每次查询时计算的新东西?好吧,现在我的brbain受伤了!