2013-09-09 2 views
11

У меня есть коллекция по названиям фабрик.Может ли составной индекс обслуживать несколько запросов

В этой коллекции будут два типа запросов, которые будут бить по подборке фабрики, показанные ниже

db.factories.find({ city: "New York", state: "NY"}); 


db.factories.find({ city: "New York", state: "NY" , country:"US"}); 

Мой вопрос, если я создать составной индекс, как показано ниже, это будет обслуживать оба запроса ??

db.factories.ensureIndex({city:1,state:1,country:1},{"unique" : false}) 
+2

Попробуйте использовать и объясните. Он должен сказать вам, если ваш запрос покрывается индексом. –

+1

да, он должен обслуживать оба запроса –

+4

Этот индекс не будет обслуживать ни один из запросов, ни один из них на самом деле потому, что индекс находится в корневом поле города и штата и страны, где, поскольку запрос находится в подполе метро – Sammaye

ответ

6

Да.

Чтобы понять, почему ответ да, нам нужно поговорить о том, как составные индексы фактически создаются.

Поля в составном индексе идут от первого до последнего со значениями всех детей, вложенных в родителей. Это означает, что если у вас были три таких документов, как:

[{ 
    _id:{}, 
    a: 1, 
    b: 2, 
    c: 3 
},{ 
    _id:{}, 
    a: 4, 
    b: 5, 
    c: 6 
},{ 
    _id:{}, 
    a: 7, 
    b: 8, 
    c: 9 
}] 

И сделал индекс на:

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

Индекса будет Infact выглядеть примерно так: {1: [2,3]} с первым значением является самым левым полем и два других являются значениями, которые происходят при этом наибольшем значении.

Конечно, это не так, как выглядит индекс, я просто сделал это, чтобы сделать его человеком доступным для всех. Чтобы узнать, как именно на самом деле сформирован индекс, вы можете посмотреть несколько презентаций, один из которых я считаю хорошим дефактором, чтобы всегда смотреть это: http://www.mongodb.com/presentations/storage-engine-internals на внутреннюю память.

Таким образом, это означает, что MongoDB работает, чтобы выбрать этот индекс с помощью метода префикса, в котором он будет говорить, что a и a,b префиксы к индексу, и он может использовать эти поля, чтобы извлечь все другие значения, необходимых из индекса.

Приставка таким образом означает, что индекс не будет работать, если вы запрашиваются:

db.collection.find({state:"NY",country:"YS"}); 
db.collection.find({state:"NY"}); 
db.collection.find({country:"YS"}); 

Хорошо отметить, что порядок в запросе не имеет значения. Вы можете сделать поля в запросе в любом порядке, где это важно, в ИНДЕКСЕ.

В любом случае, это простой пример того, почему запросы будут использовать этот единственный индекс.