MongoDB: порядок индексов и порядок запросов должны совпадать?
Этот вопрос касается внутреннего метода управления индексами и обработки Bson Documents.
При создании нескольких индексов типа "index1", "index2", "index3"... индекс хранится для использования во время запросов, но как насчет порядка запросов и производительности.
Пример
index1, index2, index3 ---- > запрос в том же порядке index1, index2, index3 (лучший случай)
index1, index2, index3 ---- > запрос в другом порядке index2, index1, index3 (измененный порядок)
Много раз вы используете вложенные запросы, включая эти 3 индекса и другие элементы или больше индексов. Порядок запросов будет означать потерянное время?. Должны ли передавать запросы, касающиеся определенного порядка индексов или внутренней архитектуры, заботиться об этом поиске заказа? Я ищу, чтобы знать, действительно ли я позабочусь об этом или могу выполнить свои запросы в режиме manier свободы.
Спасибо.
Ответы
Ответ 1
Порядок условий в вашем запросе не влияет на то, может ли он использовать индекс или нет.
например.
типичная структура документа:
{
"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"})
Таким образом, порядок условий в запросе не мешает использованию индекса - о котором я думаю, это вопрос, который вы задаете.
Вы можете легко проверить это, попробовав 2 запроса в оболочке и добавив .explain()
после поиска. Я просто сделал это, чтобы подтвердить, и оба они показали, что используется составной индекс.
однако, если вы запустите следующий запрос, это НЕ будет использовать индекс, так как FieldA не запрашивается:
db.MyCollection.find({FieldB : "B"})
Таким образом, это упорядочение полей в индексе, определяющее, может ли он использоваться запросом, а не упорядочение полей в самом запросе (об этом говорил Лукас).
Ответ 2
Из http://www.mongodb.org/display/DOCS/Indexes:
Если у вас есть составной индекс на несколько полей, вы можете использовать его для запроса в начале подмножества поля. Поэтому, если у вас есть индекс на
а, б, в
вы можете использовать запрос на
a
a, b
а, б, в
Итак, да, порядок имеет значение. Вы должны уточнить свой вопрос, если вам нужен более точный ответ.
Ответ 3
Да, как и индекс MySQL. Реализация индекса MongoDB совпадает с MySQL. Подробности вы можете увидеть http://en.wikipedia.org/wiki/B-tree.