MongoDB медленные запросы как найти и оптимизировать
Рейтинг: 70.3% · 30 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- ksenia1921
- Сообщения: 8
- Зарегистрирован: Пн май 11, 2026 5:50 pm
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — appdaemon9597
Подробно про индексную стратегию для вашего случая: правило ESR (Equality, Sort, Range) — сначала поля по которым делаешь точное равенство (userId =), потом поля сортировки (createdAt), потом поля диапазонов. Для запросов вида find({userId: X, createdAt: {$gte: Y}}).sort({createdAt: -1}) оптимальный индекс {userId: 1, createdAt: -1}. Также проверь через db.events.stats() и db.events.totalIndexSiz…
Re: MongoDB медленные запросы как найти и оптимизировать
Первым делом включи профилировщик MongoDB: db.setProfilingLevel(1, { slowms: 100 }) — это запишет в system.profile все запросы медленнее 100мс. Потом смотри db.system.profile.find().sort({millis:-1}).limit(10) — найдёшь самых злодеев. Ищи поле docsExamined: если оно в разы больше nReturned — индекс либо отсутствует, либо неэффективен.
- yaroslav_hex13
- Сообщения: 20
- Зарегистрирован: Пн май 11, 2026 8:32 am
Re: MongoDB медленные запросы как найти и оптимизировать
На 80 млн документов составной индекс обязателен. Создай db.events.createIndex({userId: 1, createdAt: -1}) — порядок полей важен. Если запросы всегда фильтруют по userId и сортируют по createdAt desc — именно такой индекс покроет оба условия и избежит in-memory sort.
- sqlreact9621
- Сообщения: 28
- Зарегистрирован: Вс май 10, 2026 9:45 pm
Re: MongoDB медленные запросы как найти и оптимизировать
explain() твой лучший друг. db.events.find({userId: 'xxx'}).sort({createdAt: -1}).explain('executionStats') покажет: используется ли индекс (IXSCAN vs COLLSCAN), сколько документов просканировано, есть ли этап SORT в памяти. Если видишь totalDocsExamined >> nReturned или стадию SORT — есть что оптимизировать.
- appdaemon9597
- Сообщения: 11
- Зарегистрирован: Вт май 19, 2026 1:16 am
Re: MongoDB медленные запросы как найти и оптимизировать
✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Подробно про индексную стратегию для вашего случая: правило ESR (Equality, Sort, Range) — сначала поля по которым делаешь точное равенство (userId =), потом поля сортировки (createdAt), потом поля диапазонов. Для запросов вида find({userId: X, createdAt: {$gte: Y}}).sort({createdAt: -1}) оптимальный индекс {userId: 1, createdAt: -1}. Также проверь через db.events.stats() и db.events.totalIndexSize() — если индексы не влезают в RAM (wiredTiger кэшируется через parameter storage.wiredTiger.engineConfig.cacheSizeGB, по умолчанию 50% RAM), то производительность деградирует из-за постоянных page fault. Ещё: если поле createdAt типа string а не Date — сортировка будет лексикографической и индекс не поможет как ожидается. Всегда храни даты как Date.
- kira_api82
- Сообщения: 29
- Зарегистрирован: Вт май 12, 2026 8:49 am
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
-
-
- GCP Billing неожиданный счёт за Cloud Storage как разобраться и оптимизировать расходы
5 ответов · 8 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость