【问题标题】:Can $in / $or queries use indexes?$in / $or 查询可以使用索引吗?
【发布时间】:2017-07-24 03:39:58
【问题描述】:

我正在通过奇妙的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 / @987654332 @落入同一个篮子?)“目前不使用任何索引”

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

谢谢!

【问题讨论】:

  • 你能分享完整的查找电话吗?您是否指定排序?这可能是 pouchdb-find 的限制。直接在 Cloudant 上进行测试时,我没有看到这个问题。你能把你的查询改成这样吗:selector: { _id: {"$gt":0}, type: {"$in": ["a", "b"]} }
  • @markwatsonatx 是完整的查询(没有排序,只是type 上的一个裸选择器)。添加_id: {"$gt":0} 就成功了。 1. 你能解释一下发生了什么吗? 2.随意将您的评论转换为答案,我会接受。谢谢!
  • 当我在选择器上创建索引时,为什么您需要在查询中包含 _id,我也很困惑。
  • @EricShell 我在this couchdb-user mailing-list thread 中询问了这个_id 技巧。事实证明:它不是一种使用索引的方式,恰恰相反:它只是一种明确地告诉 pouchdb-find 我知道我将在没有索引的情况下运行的方式,因为我的查询不适合 CouchDB 的最终 map/reduce + 基于复合键的索引,因此需要获取 allDocs 并进行内存过滤。我会暂时解决这个问题,然后用“不”回答我的问题。

标签: couchdb pouchdb cloudant couchdb-mango


【解决方案1】:

回答我的问题:不,$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 警告的一种方法 “我知道这不适合 map/reduce,我将在 allDocs 上运行内存中的操作,并且我知道 perf. 后果”。还有,

警告只是为了帮助刚开始使用 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|- |

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2012-12-07
    相关资源
    最近更新 更多