У меня есть коллекция MongoDB, которая содержит записи, используемые для организации матчей в игре. Я делаю такие запросы, чтобы получить пользователей с определенным диапазоном оценок, для определенного игрового режима, отсортированного по возрастанию идентификатора (который сначала дает мне более старые записи):
db.matchmaking.find ({matchmakingId: "test", счет: {$ lte: 2000, $ gte: 400}}). Sort ({_id: 1})
Поскольку записей может быть много, я создал этот индекс, чтобы сделать запрос быстрее:
matchmakingId_1_score_-1_id_1
Используя метод объяснения (), я могу убедиться, что в приведенном выше запросе используется мой индекс. Это делает IDXSCAN (мой индекс) -> FETCH (без фильтров) -> SORT_KEY_GENERATOR -> SORT -> DONE.
Однако я также хочу ограничить количество возвращаемых документов только 10. Итак, я добавляю метод limit:
db.matchmaking.find ({matchmakingId: "test", счет: {$ lte: 2000, $ gte: 400}}). Sort ({_id: 1}). Limit (10)
Когда я сейчас использую "объяснение ()", он больше не использует мой индекс! Вместо этого он использует этот план: IDXSCAN (_id) -> FETCH (фильтры по matchmakingId, оценка) -> LIMIT.
Итак, это приводит к нескольким вопросам:
1) Почему добавление метода limit () приводит к такому резкому изменению плана?
2) Действительно ли версия "limit ()" более эффективна? Или это зависит от объема записей в базе данных?
3) Если я буду получать доступ к этим записям с помощью «limit ()», как это, стоит ли мне даже поддерживать свой индекс? Или это не будет использоваться?