我有一个关于复合索引的问题,我似乎找不到,或者可能只是误解了。
假设我创建了一个复合索引{a:1, b:1, c:1}。这应该是根据http://docs.mongodb.org/manual/core/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"})
这些对于特定的复合索引来说是无用的吗?
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"
}
因为a
和b
在那里。
db.test.find({a:"a", b:"b",c:"c",d:"d",e:"e"})
取决于d
和e
的选择性和基数。它将使用复合索引,但它是否会有效地使用它,从而使查询的性能良好,在很大程度上取决于其中的内容。