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