Как MongoDB «limit ()» влияет на выигрышный план для запроса? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть коллекция 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 ()», как это, стоит ли мне даже поддерживать свой индекс? Или это не будет использоваться?

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