Questo capitolo introduce l'analisi delle prestazioni delle query di MongoDB, simile a SQL's explain, MongoDB supporta anche explain per analizzare le prestazioni delle dichiarazioni di query.
Utilizzo di base
Chiamando la funzione explain, è possibile ottenere il risultato dell'analisi
// Risultato dell'analisi del metodo find
db.collection.find({}).explain();
// Risultato dell'analisi del metodo aggregate
db.collection.explain().aggregate([]);
explain ha tre modalità:
- queryPlanner (predefinito)
- executionStats
- allPlansExecution
Spiegazione:
- Utilizzando queryPlanner elenca solo tutti i possibili piani di esecuzione, non esegue effettivamente la dichiarazione e mostra il piano vincitore che ha già vinto.
- Utilizzando executionStats esegue solo il piano vincitore e ne visualizza il risultato.
- Utilizzando allPlansExecution esegue tutti i piani e ne restituisce i risultati.
Utilizzo delle diverse modalità
// Modalità executionStats, semplicemente passare parametri alla funzione explain
db.collection.find({}).explain('executionStats');
// Modalità allPlansExecution
db.collection.find({}).explain('allPlansExecution');
Spiegazione del contenuto di explain
Contenuto di queryPlanner
Il seguente contenuto è il contenuto predefinito restituito da explain, ignorando le informazioni non rilevanti
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.orders",
"indexFilterSet" : false, // Principale metrica, indica se viene utilizzato il filtraggio degli indici
"winningPlan" : {
"stage" : "COLLSCAN", // Principale metrica, nome della fase di stage. Ogni fase ha informazioni specifiche, ad esempio, COLLSCAN rappresenta la scansione dell'intero contenuto della collezione
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
...
}
Tipi di fase di stage sono i seguenti:
- COLLSCAN: Scansione completa della tabella
- IXSCAN: Scansione dell'indice
- FETCH: Recupero dei documenti specifici basandosi sull'indice
- SHARD_MERGE: Unione dei dati restituiti da ogni shard
- SORT: Indica l'ordinamento in memoria
- LIMIT: Limitare il numero di ritorni
- SKIP: Utilizzo di skip
- IDHACK: Query per _id
- SHARDING_FILTER: Query di dati sharded tramite mongos
- COUNT: Operazioni di conteggio utilizzando db.coll.explain().count() o simili
- COUNTSCAN: Fase di ritorno quando il conteggio non utilizza un indice per il conteggio
- COUNT_SCAN: Fase di ritorno quando il conteggio utilizza un indice per il conteggio
- SUBPLA: Fase di ritorno per le query $or che non utilizzano gli indici
- TEXT: Fase di ritorno durante la query utilizzando gli indici full-text
- PROJECTION: Fase di ritorno per limitare i campi restituiti
Contenuto di executionStats
Il seguente contenuto è il contenuto restituito in modalità executionStats, ignorando le informazioni non rilevanti
{
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 5, // Numero di documenti restituiti
"executionTimeMillis" : 0, // Tempo di esecuzione
"totalKeysExamined" : 0, // Quanti indici sono stati esaminati
"totalDocsExamined" : 5, // Numero totale di documenti esaminati
"executionStages" : {
"stage" : "COLLS CAN", // Tipo di stage, COLLSCAN significa scansione dell'intera tabella
"nReturned" : 5,
"executionTimeMillisEstimate" : 0,
"works" : 7,
"advanced" : 5,
"needTime" : 1,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 5
}
}
}
Idee per l'ottimizzazione della query
- Utilizza gli indici il più possibile
- Meno documenti esaminati, meglio è