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 è