explain: как понять, что делает запрос
Инструмент, который показывает, как именно база выполняет ваш запрос — и использует ли индекс.
explain возвращает план выполнения запроса: какой индекс задействован, сколько документов просмотрено и сколько возвращено.
Зачем смотреть план
Запрос может работать «правильно», но медленно — если он не использует индекс. Глазами это не увидеть: результат одинаков, разница только в скорости. explain снимает завесу и показывает, что происходит под капотом.
Как вызвать
Метод explain цепляется к запросу. Режим "executionStats" даёт не только план, но и реальные числа выполнения:
db.users.find({ email: "[email protected]" })
.explain("executionStats")Ключевые поля результата
В большом выводе важны несколько мест:
- stage —
COLLSCANозначает полный перебор коллекции (плохо),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; большой разрыв — повод добавить индекс.