Сложный индекс mongodb по расширению
У меня есть вопрос, касающийся составных индексов, которые я не могу найти, или, возможно, просто неправильно понял.
Допустим, я создал составной индекс {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"})
Будут ли они бесполезны для этого конкретного составного индекса?
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"
}
поскольку a
а также b
здесь.
db.test.find({a:"a", b:"b",c:"c",d:"d",e:"e"})
Зависит от селективности и мощности d
а также e
, Он будет использовать составной индекс, но вопрос о том, будет ли он эффективно его использовать таким образом, чтобы обеспечить достойную производительность запроса, во многом зависит от того, что там находится.