Эта глава посвящена анализу производительности запросов в MongoDB, подобно SQL-функции explain, MongoDB также поддерживает explain для анализа производительности операторов запросов.
Базовое использование
Вызовом функции explain вы можете получить результат анализа
// Результат анализа метода find
db.collection.find({}).explain();
// Результат анализа метода aggregate
db.collection.explain().aggregate([]);
explain имеет три режима:
- queryPlanner (по умолчанию)
- executionStats
- allPlansExecution
Объяснение:
- Используя queryPlanner перечисляются все возможные планы выполнения, фактический оператор не выполняется, отображается план winningPlan, который уже выиграл.
- Используя executionStats выполняется только план winningPlan и выводится результат.
- Используя allPlansExecution выполняются все планы и выводятся результаты.
Использование различных режимов
// Режим executionStats, просто передайте параметры в функцию explain
db.collection.find({}).explain('executionStats');
// Режим allPlansExecution
db.collection.find({}).explain('allPlansExecution');
Объяснение содержания explain
Содержание queryPlanner
Следующее содержание является содержанием, возвращаемым по умолчанию explain, игнорируя неключевую информацию
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.orders",
"indexFilterSet" : false, // Основной показатель, используется ли индекс для фильтрации данных
"winningPlan" : {
"stage" : "COLLSCAN", // Основной показатель, название этапа фазы. У каждой фазы есть специфическая информация, например, COLLSCAN представляет сканирование всего содержимого коллекции
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
...
}
Типы фаз этапов:
- COLLSCAN: Полное сканирование таблицы
- IXSCAN: Сканирование индекса
- FETCH: Получение конкретных документов на основе индекса
- SHARD_MERGE: Слияние данных, возвращаемых каждым узлом
- SORT: Указывает сортировку в памяти
- LIMIT: Ограничивает количество возвращаемых значений
- SKIP: Игнорирование использования
- IDHACK: Запрос для _id
- SHARDING_FILTER: Запрос данных через mongos
- COUNT: Операции подсчета с использованием db.coll.explain().count() или подобные
- COUNTSCAN: Этап возвращается, когда подсчет не использует индекс для подсчета
- COUNT_SCAN: Этап возвращается при использовании индекса для подсчета
- SUBPLA: Этап возвращается для запросов $or без использования индексов
- TEXT: Этап возвращается при запросе с использованием полнотекстовых индексов
- PROJECTION: Этап возвращается для ограничения возвращаемых полей
Содержание executionStats
Следующее содержание представляет собой содержание, возвращаемое в режиме executionStats, игнорируя неключевую информацию
{
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 5, // Количество возвращенных документов
"executionTimeMillis" : 0, // Время выполнения
"totalKeysExamined" : 0, // Сколько индексов отсканировано
"totalDocsExamined" : 5, // Общее количество отсканированных документов
"executionStages" : {
"stage" : "COLLS CAN", // Тип этапа, COLLSCAN означает сканирование всей таблицы
"nReturned" : 5,
"executionTimeMillisEstimate" : 0,
"works" : 7,
"advanced" : 5,
"needTime" : 1,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 5
}
}
}
Идеи оптимизации запросов
- Используйте индексы насколько это возможно
- Чем меньше отсканированных документов, тем лучше