MongoDB: порядок индексов и порядок запросов должны совпадать? - PullRequest
22 голосов
/ 09 марта 2011

Этот вопрос касается внутреннего метода управления индексами и поиска документов Bson.

Когда вы создаете несколько индексов, таких как "index1", "index2", "index3" ... индекс сохраняетсяиспользуется во время запросов, но как обстоят дела с порядком запросов и производительностью.

sample
index1, index2, index3 ----> запрос в том же порядке index1, index2, index3 (лучший случай)index1, index2, index3 ----> запрос в другом порядке index2, index1, index3 (порядок изменен)

Много раз вы используете вложенные запросы, включая эти 3 индекса и другие элементы или несколько индексов.Порядок запросов будет означать потерянное время?Должен ли проходить запрос в соответствии с заданным порядком индексов, или внутренняя архитектура позаботится об этом поиске порядка?Я искал, чтобы узнать, позабочусь ли я об этом или смогу сделать мои запросы свободнее.

Спасибо.

Ответы [ 3 ]

37 голосов
/ 09 марта 2011

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

например, типичная структура документа:

{
    "FieldA" : "A",
    "FieldB" : "B"
}

Если у вас составной индекс наA и B:

db.MyCollection.ensureIndex({FieldA : 1, FieldB : 1})

Тогда оба следующих запроса смогут использовать этот индекс:

db.MyCollection.find({FieldA : "A", FieldB : "B"})
db.MyCollection.find({FieldB : "B", FieldA : "A"})

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

Вы можете легко проверить это, попробовав два запроса в оболочке и добавив .explain() после поиска.Я просто сделал это, чтобы подтвердить, и они оба показали, что использовался составной индекс.

однако, если вы выполните следующий запрос, он НЕ будет использовать индекс, так как FieldA не запрашивается:

db.MyCollection.find({FieldB : "B"})

Таким образом, порядок полей в индексе определяет, может ли он использоваться запросом, а не порядок полей в самом запросе (именно об этом говорил Лукас).

11 голосов
/ 09 марта 2011

С http://www.mongodb.org/display/DOCS/Indexes:

Если у вас есть составной индекс несколько полей, вы можете использовать его для запрос в начале подмножества поля. Так что если у вас есть индекс на

а, б, в

Вы можете использовать его запрос на

a

а, б

а, б, в

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

0 голосов
/ 10 марта 2011

Да, как и в индексе MySQL. Реализация индекса MongoDB такая же, как и в MySQL. Подробности вы можете увидеть http://en.wikipedia.org/wiki/B-tree.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...