【问题标题】:Why MongoDB cannot use a compound index that is much similar(not exact) to the query?为什么 MongoDB 不能使用与查询非常相似(不精确)的复合索引?
【发布时间】:2013-10-31 05:51:20
【问题描述】:

考虑下面的 Mongo 索引策略和查询,

索引:

db.collec.ensureIndex({a:1,b:1,c:1});

查询:

db.collec.find({"a":"valueA"},{"_id":0,"a":1,"c":1}).sort({"c":-1}).limit(150)

上述查询的解释返回:

/* 0 */
{
    "cursor" : "BtreeCursor a_1_b_1_c_1",
    "isMultiKey" : false,
    "n" : 150,
    "nscannedObjects" : 178,
    "nscanned" : 178,
    "nscannedObjectsAllPlans" : 279,
    "nscannedAllPlans" : 279,
    "scanAndOrder" : true,
    "indexOnly" : true,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 1,
    "indexBounds" : {
        "a" : [ 
            [ 
                "valueA", 
                "valueA"
            ]
        ],
        "b" : [ 
            [ 
                {
                    "$minElement" : 1
                }, 
                {
                    "$maxElement" : 1
                }
            ]
        ],
        "c" : [ 
            [ 
                {
                    "$minElement" : 1
                }, 
                {
                    "$maxElement" : 1
                }
            ]
        ]
    }
}

这里的问题是 它清楚地表明查询完全在索引上运行(如"indexOnly" : true)。 但是为什么"scanAndOrder" : true
根据 Btree 索引模型,c 位于索引的尾部,因此可以用于排序。没有?

为什么不使用?

【问题讨论】:

    标签: mongodb mongodb-query explain mongodb-indexes b-tree-index


    【解决方案1】:

    如果你使用下面的索引扫描和顺序将是错误的。

    db.collec.ensureIndex({a:1,c:-1,b:1});

    Check this out

    【讨论】:

    • 是的,我接受。但该索引并非专门用于此查询,它已经存在,我是第一次进行此查询。仅供参考,更改索引会根据索引影响查询。我的问题是为什么它不能使用索引来排序,即使 c 在索引的尾部?
    【解决方案2】:

    这是正确的,也是documented

    至于为什么:索引本质上看起来像这棵树:

    • A:“值 A”
      • B:“ABC”
        • C: 435
        • C: 678
      • B:“BCD”
        • C: 123
        • C: 993

    如您所见,排序是正确且升序的,但如果您按顺序获取 c 的值,而不限于固定 b 的子集,您将得到 [435, 678, 123, 993],即不正确,所以需要scanAndOrder

    很遗憾,没有index intersectioning 的索引非常不灵活。

    【讨论】:

    • 可能会很好补充:jira.mongodb.org/browse/SERVER-3071 得到的宣传越多,mongodb 公司就越有可能实现它
    • 好点!我添加了答案的链接,因为很多人可能不知道该术语,即使他们知道该功能。
    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多