mongodb复合指数超过延伸

时间:2013-04-25 10:24:46

标签: mongodb compound-index

我有一个关于复合索引的问题,我似乎无法找到,或者可能只是被误解了。

假设我创建了一个复合索引{a:1,b:1,c:1}。这应该根据 http://docs.mongodb.org/manual/core/indexes/#compound-indexes

快速进行以下查询。

db.test.find({a:"a", b:"b",c:"c"})
db.test.find({a:"a", b:"b"})
db.test.find({a:"a"})

据我了解,查询的顺序非常重要,但是只有{a:“a”,b:“b”,c:“c”}的显式子集是重要的吗?

让我说我做一个查询

db.test.find({d:"d",e:"e",a:"a", b:"b",c:"c"})

db.test.find({a:"a", b:"b",c:"c",d:"d",e:"e"})

这些特定的复合指数会变得无用吗?

1 个答案:

答案 0 :(得分:1)

MongoDB中的复合索引使用前缀机制,a{a,b}将按顺序视为复合索引的前缀,但是,查询本身中字段的顺序不会通常很重要。

让我们举个例子:

db.test.find({d:"d",e:"e",a:"a", b:"b",c:"c"})

实际上会使用索引:

db.ghghg.find({d:1,e:1,a:1,c:1,b:1}).explain()
{
        "cursor" : "BtreeCursor a_1_b_1_c_1",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 2,
        "nscannedAllPlans" : 2,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "a" : [
                        [
                                1,
                                1
                        ]
                ],
                "b" : [
                        [
                                1,
                                1
                        ]
                ],
                "c" : [
                        [
                                1,
                                1
                        ]
                ]
        },
        "server" : "ubuntu:27017"
}

由于ab在那里。

db.test.find({a:"a", b:"b",c:"c",d:"d",e:"e"})

取决于de的选择性和基数。它将使用复合索引,但是它是否会以这样一种方式有效地使用它,以便允许查询的良好性能在很大程度上取决于那里的内容。