Сложный индекс 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, Он будет использовать составной индекс, но вопрос о том, будет ли он эффективно его использовать таким образом, чтобы обеспечить достойную производительность запроса, во многом зависит от того, что там находится.

Другие вопросы по тегам