Как правильно использовать индексы в MongoDB?

Недавно заинтересовался MongoDB и на выходные сел почитать, что это такое, и столкнулся с тем, что не совсем понимаю, как устроены индексы в Mongo
Разбирается запрос:
db.users.find({"age" : {"$gte" : 25, "$lte" : 35}}).
sort({"username" : 1}).limit(100)
и советуется брать следующий индекс {"username" : 1, "age" : 1}, вместо
{"age":1,"username":1}.

Если количество записей в базе N(N>=10^6), a количество подходящих записей K(K=N/10), то в первом случае количество чтений с внешней памяти (в худшем случае) будет O(N), а во втором - K+время на сортировку К элементов ~O(K*log(K)), что, кажется, гораздо быстрее, за N чтений из внешней памяти. Поправьте, если где неправ.

Заранее спасибо!
  • Вопрос задан
  • 6112 просмотров
Пригласить эксперта
Ответы на вопрос 1
@lega
db.users.find({"age" : {"$gte" : 25, "$lte" : 35}}).sort({"username" : 1}).limit(100)
советуется брать следующий индекс {"username" : 1, "age" : 1}, вместо
{"age":1,"username":1}.

А должно быть наоборот.

Зачастую (но не всегда) порядок такой:
1) Фильтр на точные значения
2) Поля сортировки
3) Фильтр на "выборочные" значения (массивы).

В вашем случае ("age" : {"$gte" : 25, "$lte" : 35}) - это как бы точное значение (т.к. оно укладывается в "a < x < b"), далее идет сортировка ("username" : 1).
Т.е. получается монга "берет" пачку данных ...24,|25<=age<=35|,36... где в каждом из возрастов выбирает все значения по порядку т.к. они уже отсортированы.

Если индекс будет наоборот ({"username" : 1, "age" : 1}), то монга будет "входить" как бы в каждый username, брать из каждого вхождения диапазон 25<=age<=35, а потом сортировать все данные. - т.е. сортировка в начале тут лишняя.
Как то так.

Очень важно что-б сортировка "не ломалась" при проходе по индексу.

Вот полезная статья.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы