Эта глава посвящена анализу производительности запросов в 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
		}
	}
}

Идеи оптимизации запросов

  • Используйте индексы насколько это возможно
  • Чем меньше отсканированных документов, тем лучше