$ in / $或查询可以使用索引吗?

时间:2016-11-18 21:42:12

标签: couchdb pouchdb cloudant couchdb-mango

我通过精彩的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 ,但也许我的$in / $or属于同一个篮子?)"目前不使用任何索引"

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

谢谢!

1 个答案:

答案 0 :(得分:6)

回答我的问题:不,$in / or查询无法使用索引。我在this user@couchdb mailing list thread询问了问题,Garren Smith回答并指出了Understanding Mango View-Based Indexes vs. Search-Based IndexesA look under the covers of PouchDB-find。引用加伦的话,

  

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

     

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

所以,小心,"_id": {"$gt": 0}绝不是一种使用索引的方式(这是@markwatsonatx建议时给我的印象),它只是一种抑制pouchdb的方法-find的警告,告诉它"我知道这不适合地图/减少,我将在allDocs上运行内存操作,而我&#39 ;我知道这个性能。后果" 。此外,

  

警告只是为了帮助任何刚接触芒果的人   做不是大型数据库的最佳方式,但在小型数据库上会很好   数据库。这是一种很好的实验方法,但一旦你开始注意到性能问题,创建索引就是前进的方向。

我补充了我制作的一些基准,比较了不同的方法来获取{10,100,1000,10000}"案例" (在索引字段上使用选择器)来自包含[10000个案例,100000个噪声文档]

的数据库

|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|- |