【问题标题】:CouchDB performance of views vs HTTP bulk fetch视图的 CouchDB 性能与 HTTP 批量获取
【发布时间】:2012-07-16 18:22:24
【问题描述】:

我有几个 CouchDB 数据库,都在数百 GB,我需要以依赖于多个数据库的方式从中获取文档,例如(伪代码,前缀表示文档来自哪个数据库):

for each Db1_Document in Db1
    if Db1_Document has field "Db2_match"
        Db2_Document = Db1_Document.Db2_match
        for each Db2_Reference in Db2_Document.references
            if Db2_Reference has empty field "Db1_match"
                add Db2_Reference to List bigList
        emit [Db2_Document, bigList]

我可以用一组复杂(和 hacky)的视图来做到这一点。或者我可以批量 HTTP 获取我需要的文档并使用 Java 进行处理。

与创建视图相比,批量 HTTP 获取的成本是多少? CouchDB 本身不支持视图链接的事实是否足以避免视图解决方案?

这是一个效率非常重要的应用程序。

【问题讨论】:

    标签: couchdb mapreduce


    【解决方案1】:

    在 Couch 中创建视图是 I/O 和 CPU 密集型的,尤其是因为它会影响实例中的所有文档。

    如果您的逻辑影响所有文档,那么创建视图可能是最有效的机制。如果您有一个相当粗略的视图已经为您提供了此处理所需的子集(或子集的超集,但少于整个 DB),那么最好简单地获取您需要的子集并在本地处理它.

    【讨论】:

      【解决方案2】:

      您可能会发现创建一个使用过滤复制将所有信息从其他数据库提取到另一个数据库的新数据库更容易/更好。然后对其他数据库进行查询。您的数据会有点陈旧,但将所有相关数据放在一个数据库中的优势在于可以编写一个可以查看所有相关文档的视图。因此,当新文档从复制步骤到达时,该视图将被索引并增量更新。

      这将提供最好的世界:

      • 您将能够编写有意义的视图。
      • 您只会将需要的数据提取到 Java 代码中。
      • 您仍然会在运行时获得性能优势,因为视图将被编入索引,并随着新数据从复制中到达而增量更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-17
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多