7

我正在通过奇妙的pouchdb-find在 CouchDB 2.0 实例上使用 Mango 查询。

有几次我得到了可怕的no matching index found, create an index to optimize query time警告,即使我使用的索引字段。

刚才我在选择"type": {"$in": ["a", "b"]}或等效项时得到了它"$or": [{"type": "a"}, {"type": "b"}],即使type存在索引。

谷歌搜索(cloudant query docspouchdb-find docsSO question)没有帮助,而在后者@nlawson 说一些谓词($ne在上述问题中,但也许 my $in/$or属于同一个篮子?)“目前没有使用任何索引”

  • 如果我确实在同一条船上,那是什么意思?无法在使用某些谓词的查询上使用索引是芒果后端的限制,还是 pouchdb 的限制?
  • 我做错了什么/是否有索引解决方法来避免这种情况?
    • 更一般地说,是否有我可以阅读的文档以更深入地了解索引的工作原理以及如何对其进行故障排除?

谢谢!

4

1 回答 1

9

回答我的问题:不,$in/or查询不能使用索引。我在这个 user@couchdb 邮件列表线程中问了这个问题,Garren Smith 回答并指出了理解 Mango 基于视图的索引与基于搜索的索引A look under the cover of PouchDB-find。引用加伦的话,

添加"_id": {"$gt": 0}工作的原因是因为 pouchdb-find/mango 使用_all_docs索引获取所有文档,然后$in在内存中处理运算符。

如果您有一个大型数据库,这将受到伤害。但是您可以使用比0减少需要在内存中排序的文档数量更好的值,这是一件好事。

所以,小心,"_id": {"$gt": 0}绝不是一种使用索引的方法(这是我在@markwatsonatx 建议时得到的印象),它只是一种抑制 pouchdb-find 警告的方法,告诉它“我知道这不适合map/reduce,我将在 allDocs 上运行内存中的操作,并且我知道性能的后果”。还,

该警告只是为了帮助刚开始使用 Mango 的任何人,他们正在做的不是大型数据库的最佳方式,但在小型数据库上会很好。这是一种很好的试验方式,但是一旦您开始注意到性能问题,创建索引就是前进的方向。

我将补充我所做的一个小基准,比较从包含 [10000 个案例,100000 个噪声文档] 的数据库中获取 {10、100、1000、10000} 个“案例”(在索引字段上使用选择器)的不同方法

|number of cases fetched|10 |100 |1000 |10000 | |-----------------------|------|-------|--------|------| |$in |2452ms|2539ms |2474ms |5032ms| |$in + $gt |905ms |784ms |1014ms |3805ms| |$in + $gt + $lt |5ms |13ms |100ms |3854ms| |$or |2638ms|11763ms|101279ms|- |

于 2017-01-27T15:09:03.197 回答