explain: как понять, что делает запрос

Инструмент, который показывает, как именно база выполняет ваш запрос — и использует ли индекс.

explain возвращает план выполнения запроса: какой индекс задействован, сколько документов просмотрено и сколько возвращено.

Зачем смотреть план

Запрос может работать «правильно», но медленно — если он не использует индекс. Глазами это не увидеть: результат одинаков, разница только в скорости. explain снимает завесу и показывает, что происходит под капотом.

Как вызвать

Метод explain цепляется к запросу. Режим "executionStats" даёт не только план, но и реальные числа выполнения:

db.users.find({ email: "[email protected]" })
  .explain("executionStats")

Ключевые поля результата

В большом выводе важны несколько мест:

  • stageCOLLSCAN означает полный перебор коллекции (плохо), IXSCAN — использование индекса (хорошо).
  • totalDocsExamined — сколько документов база реально просмотрела.
  • nReturned — сколько документов вернула.

Главный сигнал здоровья запроса — totalDocsExamined близко к nReturned. Если просмотрели миллион, а вернули три — индекс не работает, база перелопатила всю коллекцию.

Читаем результат

Без индекса по email план покажет полный скан:

Результат:

{
  "executionStats": {
    "nReturned": 1,
    "totalDocsExamined": 1000000,
    "executionStages": { "stage": "COLLSCAN" }
  }
}

После createIndex({ email: 1 }) тот же запрос покажет IXSCAN и totalDocsExamined: 1 — база сразу пришла к нужному документу через индекс. Это и есть доказательство, что индекс помог.

Когда применять

explain — первый инструмент при разборе медленных запросов. Заметили, что какой-то запрос тормозит на проде? Прогоните его через explain("executionStats"), посмотрите на stage и соотношение examined/returned — и решите, нужен ли индекс. Это превращает оптимизацию из гадания в измерение.

Итог

  • explain("executionStats") показывает план и реальные числа выполнения запроса.
  • COLLSCAN — полный перебор (плохо), IXSCAN — работа через индекс (хорошо).
  • Здоровый запрос: totalDocsExamined близко к nReturned; большой разрыв — повод добавить индекс.
Проверьте себя
1. Что показывает explain?
AСписок всех коллекций
BПлан выполнения запроса: используется ли индекс и сколько документов просмотрено
CСодержимое всех документов
DРазмер базы данных
2. Что означает stage COLLSCAN в выводе explain?
AЗапрос использует индекс
BЗапрос перебирает всю коллекцию без индекса
CЗапрос отклонён
DКоллекция пуста
3. Какое соотношение в executionStats говорит о здоровом запросе?
AtotalDocsExamined намного больше nReturned
BtotalDocsExamined близко к nReturned
CnReturned равно нулю
DЧем больше examined, тем лучше
Поддержать проект