Couchdb芒果性能与地图减少视图

时间:2016-11-22 23:12:57

标签: couchdb couchdb-mango

我刚刚注意到在Couchdb 2.0的the release notes中,提到了Mango查询被推荐用于新的应用程序。还有人提到,Mango索引显然比javascript查询快2到x10,这让我感到很惊讶,因此我有很多问题:

  • Map / Reduce视图是否被淘汰?我希望答案是否定的,因为在我看来,Mango并没有涵盖Map / Reduce的所有用例(最简单的例子是Reduce本身),而且这种查询风格的灵活性似乎也更加有限。但由于建议,我更愿意提问:
  

我们建议所有新应用都默认使用Mango。

  • 我们知道Map / Reduce视图依赖于B树,但我在文档或邮件列表中找不到任何有关Mango背后魔术的见解。芒果对我来说基本上是白魔法。然而,我可以说,深入了解javascript视图如何在幕后编入索引,对于避免陷阱,天真实现以及优化性能非常有帮助。有没有人对芒果如何运作有任何见解?索引B树也是吗?由于不再有设计文档,索引何时更新?性能提升来自哪里? (这些收益对我来说是违反直觉的,因为根据我的理解,javascript查询的性能来自Map函数的预先计算性质)

我基本上追求的是芒果的一些见解,另一方面,概述芒果和地图/减少应该如何在2.x时代共同生活。

3 个答案:

答案 0 :(得分:9)

我最近尝试将我的应用切换到使用Mango查询,结果是完全删除它并切换回map / reduce。以下是我的一些原因:

  1. 在处理未完全指定要使用的索引的查询时,Mango是错误的。上周末,这个让我吵了一阵。如果未指定索引,有时会选择备用索引并返回no(或不正确)结果。
  2. 芒果表现不是'神奇'。许多类型的查询最终会在内存搜索中完成。 Couch将选择最适合的索引然后在内存中遍历所有这些记录以适应角落情况。 Cloudant通过使用基于文本的搜索来解决其中一些问题,这些搜索在Couchdb中不可用。
  3. 正如您所指出的,Mango搜索根本无法很好地处理某些类型的查询构造。我不认为我的应用程序过于复杂,但我遇到了几种情况,我无法为手头的任务构建合适的Mango查询。这里主要的是搜索数组以查找标记(例如,搜索以查看用户是组的成员)。 Mango无法索引数组元素,因此可以在内存中进行完全扫描。
  4. 视图具有一些非常强大的功能,可以以列表的形式转换搜索结果。芒果不存在这种情况。
  5. 您的里程可能会有所不同,但只是想留下一个警告,这仍然是一个非常新的功能。

答案 1 :(得分:5)

来自核心开发人员的回答:

  

一些好问题。我不认为芒果会取代Map / Reduce   完全。它是一种替代查询工具。有什么好处的   Mango查询语法是更容易理解和   开始吧我们可以在很多地方使用它   查询文件。它可以用于复制过滤和   更改Feed。我们希望很快能够获得验证文档的支持   更新。

     

Mango正在使用erlang map / reduce。这意味着它   像map / reduce一样创建B树索引。是什么让它变得更快   它正在使用erlang / native函数来创建B-Tree   的JavaScript。很久以前我写了一篇关于内部的博客文章   PouchDB-find [1]是PouchDB的芒果语法。它可能   帮助您了解内部工作原理。钥匙   要理解的是,有一个Map查询部分使用了   B-Tree和内存过滤器。理想情况下,过滤内存越少   查询的速度越快。

     

我想说芒果是一个非常重要的工作,但基本的   地面工作完成了。肯定有一些我们可以改进的东西。   我看到它在开发人员开始一个新项目时使用了很多   因为它可以快速简单地进行基本查询,比如通过电子邮件查找   查找或查找名为“John Rambo”的所有用户。

     

希望有所帮助。

     

[1] http://www.redcometlabs.com/blog/2015/12/1/a-look-under-the-covers-of-pouchdb-find

答案 2 :(得分:1)

我是Mango和CouchDB的新手,但我想我可以提供一些见解。一旦您的索引/视图更新,芒果就不会更快。 Mango的巨大性能提升是您第一次创建索引时因为沙发不需要为此创建单独的couchjs进程。

我发现即使你的一些文件太大,芒果也能很好地运作。目前使用CouchDB 2.0.0,至少使用Windows,大型文档会崩溃与Map / Reduce一起使用的couchjs.exe视图服务器。 CouchDB 1.6.1不是这种情况,并且已在开发版https://github.com/apache/couchdb-couch/commit/1659fda5dd1808f55946a637fc26c73913b57e96

中修复