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

    @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, а потом сортировать все данные. - т.е. сортировка в начале тут лишняя.
    Как то так.

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

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