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

Рейтинг: 70.3% · 30 голосов
SQL и NoSQL: PostgreSQL, MySQL, Redis, MongoDB, ClickHouse, ElasticSearch — проектирование схем, индексы, репликация и оптимизация запросов.
Ответить
Аватара пользователя
ksenia1921
Сообщения: 8
Зарегистрирован: Пн май 11, 2026 5:50 pm

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

Сообщение ksenia1921 »

Приложение на MongoDB 6.0 начало тормозить под нагрузкой. Коллекция events около 80 млн документов. Запросы по полям userId + createdAt иногда выполняются секундами. Как найти проблемные запросы и понять что именно тормозит?
👍1 ❤️2 🔥 😄 🤔
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — 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…
Перейти к ответу →
Аватара пользователя
mark9640
Сообщения: 26
Зарегистрирован: Пн май 11, 2026 4:32 am

Re: MongoDB медленные запросы как найти и оптимизировать

Сообщение mark9640 »

Первым делом включи профилировщик 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 медленные запросы как найти и оптимизировать

Сообщение yaroslav_hex13 »

На 80 млн документов составной индекс обязателен. Создай db.events.createIndex({userId: 1, createdAt: -1}) — порядок полей важен. Если запросы всегда фильтруют по userId и сортируют по createdAt desc — именно такой индекс покроет оба условия и избежит in-memory sort.
👍4 ❤️2 🔥2 😄2 🤔
Аватара пользователя
sqlreact9621
Сообщения: 28
Зарегистрирован: Вс май 10, 2026 9:45 pm

Re: MongoDB медленные запросы как найти и оптимизировать

Сообщение sqlreact9621 »

explain() твой лучший друг. db.events.find({userId: 'xxx'}).sort({createdAt: -1}).explain('executionStats') покажет: используется ли индекс (IXSCAN vs COLLSCAN), сколько документов просканировано, есть ли этап SORT в памяти. Если видишь totalDocsExamined >> nReturned или стадию SORT — есть что оптимизировать.
👍2 ❤️1 🔥 😄1 🤔
Аватара пользователя
appdaemon9597
Сообщения: 11
Зарегистрирован: Вт май 19, 2026 1:16 am

Re: MongoDB медленные запросы как найти и оптимизировать

Сообщение 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.totalIndexSize() — если индексы не влезают в RAM (wiredTiger кэшируется через parameter storage.wiredTiger.engineConfig.cacheSizeGB, по умолчанию 50% RAM), то производительность деградирует из-за постоянных page fault. Ещё: если поле createdAt типа string а не Date — сортировка будет лексикографической и индекс не поможет как ожидается. Всегда храни даты как Date.
👍1 ❤️ 🔥 😄1 🤔
Аватара пользователя
kira_api82
Сообщения: 29
Зарегистрирован: Вт май 12, 2026 8:49 am

Re: MongoDB медленные запросы как найти и оптимизировать

Сообщение kira_api82 »

Mongostat и mongotop запускай во время нагрузки — mongostat покажет количество операций в секунду, page faults, очереди на чтение/запись. Если qr|qw растут — это признак нехватки ресурсов или локов.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
makar3270
Сообщения: 6
Зарегистрирован: Вт май 12, 2026 10:35 pm

Re: MongoDB медленные запросы как найти и оптимизировать

Сообщение makar3270 »

Кстати, для аналитики по events с фильтрами за большие диапазоны дат MongoDB не самый лучший выбор. Если это логи или события — посмотри на ClickHouse или TimescaleDB, они для таких сценариев значительно быстрее.
👍1 ❤️ 🔥 😄 🤔1
Ответить
Поделиться темой: ✈ Telegram VK

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость