Este capítulo apresenta a análise de desempenho de consultas no MongoDB. Similar ao "explain" do SQL, o MongoDB também suporta o "explain" para analisar o desempenho das declarações de consulta.

Uso Básico

Ao chamar a função explain, você pode obter o resultado da análise

// Resultado da análise do método find
db.collection.find({}).explain();

// Resultado da análise do método aggregate
db.collection.explain().aggregate([]);

explain possui três modos:

  • queryPlanner (padrão)
  • executionStats
  • allPlansExecution

Explicação:

  • Usando queryPlanner lista apenas os planos de execução possíveis, não executa a declaração real e exibe o plano winningPlan que já venceu.
  • Usando executionStats executa apenas o plano winningPlan e exibe o resultado.
  • Usando allPlansExecution executa todos os planos e exibe os resultados.

Uso de diferentes modos

// modo executionStats, simplesmente passe parâmetros para a função explain
db.collection.find({}).explain('executionStats');

// modo allPlansExecution
db.collection.find({}).explain('allPlansExecution');

Explicação do conteúdo do explain

Conteúdo do queryPlanner

O seguinte conteúdo é o conteúdo padrão retornado pelo explain, ignorando informações não essenciais

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.orders",
		"indexFilterSet" : false, // Métrica chave, se os dados de filtragem de índice são usados
		"winningPlan" : {
			"stage" : "COLLSCAN",  // Métrica chave, nome da fase de estágio. Cada fase tem informações específicas da fase, por exemplo, COLLSCAN representa a varredura de todo o conteúdo da coleção
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	}
	...
}

Tipos de fases de estágio são os seguintes:

  • COLLSCAN: Varredura completa da tabela
  • IXSCAN: Varredura de índice
  • FETCH: Recuperar documentos específicos com base no índice
  • SHARD_MERGE: Mesclar dados retornados por cada fragmento
  • SORT: Indica classificação na memória
  • LIMIT: Limitar o número de retornos
  • SKIP: Pular utilizando
  • IDHACK: Consulta para _id
  • SHARDING_FILTER: Consultar dados fragmentados através do mongos
  • COUNT: Operações de contagem usando db.coll.explain().count() ou similar
  • COUNTSCAN: Estágio retornado quando a contagem não está usando um índice para contagem
  • COUNT_SCAN: Estágio retornado quando a contagem está usando um índice para contagem
  • SUBPLA: Estágio retornado para consultas $or que não estão usando índices
  • TEXT: Estágio retornado ao consultar usando índices de texto completo
  • PROJECTION: Estágio retornado para limitar os campos retornados

Conteúdo de executionStats

O seguinte conteúdo é o conteúdo retornado no modo executionStats, ignorando informações não essenciais

{
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 5,  // Número de documentos retornados
		"executionTimeMillis" : 0, // Tempo de execução
		"totalKeysExamined" : 0, // Quantos índices são examinados
		"totalDocsExamined" : 5, // Número total de documentos examinados
		"executionStages" : {
			"stage" : "COLLS CAN", // Tipo de estágio, COLLSCAN significa varredura de toda a tabela
			"nReturned" : 5,
			"executionTimeMillisEstimate" : 0,
			"works" : 7,
			"advanced" : 5,
			"needTime" : 1,
			"needYield" : 0,
			"saveState" : 0,
			"restoreState" : 0,
			"isEOF" : 1,
			"direction" : "forward",
			"docsExamined" : 5
		}
	}
}

Ideias de Otimização de Consulta

  • Use índices sempre que possível
  • Quanto menos documentos examinados, melhor