【问题标题】:How does MongoDB compound indexes actually work?MongoDB 复合索引实际上是如何工作的?
【发布时间】:2019-04-23 18:03:05
【问题描述】:

我在 mongodb 中创建复合索引时,发现了一个奇怪的行为。 我创建了一个索引:

db.getCollection('Subject').createIndex({a:1, b:2, c:3})

它创建了一个名为 a_1_b_2_c_3 的索引。

现在当我使用 mongo find 命令时:

db.getCollection('Subject').find({a:1, b:2, c:3}) //it works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({a:1, b:2}) //this also works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({a:1, c:2}) //this also works fine `a_1_b_2_c_3` is used.
db.getCollection('Subject').find({b:1, c:2}) //But this command doesn't uses the index `a_1_b_2_c_3`.

谁能告诉我为什么会发生这种行为?

【问题讨论】:

    标签: mongodb mongodb-indexes


    【解决方案1】:

    这是由于index prefixes。索引{a:1, b:1, c:1} 具有前缀{ a: 1 } 和{ a: 1, b: 1},因此在这些字段上包含过滤器的查询将使用该索引。

    从概念上讲,将索引想象成一个 B 树,它以 a 上的过滤器开始,并在 b 和 c 上具有较低级别的子树。较早的查询可以轻松地从树的顶部开始并向下工作,而最后一个查询 ({b:1, c:2}) 没有简单的起点。

    【讨论】:

      【解决方案2】:

      如果您仍想强制 MongoDB 使用您的索引,您可以按如下方式伪造查询(我已经测试过了)。在这种情况下,我假设您的集合中 'a' 的值仅为正整数。

      db.Subject.explain("executionStats").find({a:{$gt:-1}, b:1, c:2})
      
      

      这可能会影响其他应用程序功能,或者如果此类查询是标准模式,请创建专用索引来处理查询。

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 2019-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-01
        • 2017-07-05
        相关资源
        最近更新 更多