Ciò è stato spiegato nella modalità allPlansExecution pagina della documentazione. Parafrasando:
Durante la selezione del piano, se sono presenti più indici in grado di soddisfare una query, MongoDB eseguirà una prova utilizzando tutti i piani validi per determinare quale sia il migliore. Vedi Piani di query per i dettagli relativi a questo processo.
A partire da MongoDB 3.4.6, la selezione del piano prevede l'esecuzione di piani candidati in parallelo in una "gara" e vedere quale piano candidato restituisce per primo 101 risultati. Nel tuo esempio sopra, quando il piano vincente ha restituito 101 risultati nella gara, il piano perdente ha ottenuto solo 2 risultati. Il piano vincente viene quindi eseguito fino al completamento. Questo è il motivo per cui il piano perdente mostra solo nReturned: 2
nelle statistiche.
Questa "gara" viene eseguita poiché se ci sono due piani dall'aspetto identico, MongoDB non sa quale piano sia il migliore per una particolare query a causa della flessibilità dei documenti JSON (a differenza ad esempio di SQL in cui è nota la struttura delle tabelle) . Naturalmente, è del tutto possibile che MongoDB indovini in modo errato e finisca con un piano meno che performante, poiché si tratta di un processo empirico. Per questo motivo, è meglio creare indici che supportino le tue query in modo che MongoDB non debba indovinare. Altrimenti puoi usare hint()
per dire a MongoDB quale indice utilizzare per una determinata query.
Quindi:
- Le statistiche per il piano vincente sono le statistiche dei risultati effettivi della query.
- Le statistiche per i piani perdenti mostrano solo le statistiche per l'esecuzione di prova della pianificazione delle query.
- La selezione del piano prevede l'esecuzione di una "gara" a 101 risultati. Questa corsa viene eseguita solo quando sono presenti più indici in grado di soddisfare la query.
Nota 1 :Nessuno dei due piani che hai visto era fantastico. Il piano vincente mostra "nReturned" : 43
, "totalKeysExamined" : 221
e "totalDocsExamined" : 219
. Ciò significa che MongoDB deve esaminare 219 documenti solo per restituirne 43:solo il 20% di efficienza . Idealmente, vuoi avere il nReturned
numeri uguali a totalDocsExamined
.
Nota 2 :Prova a creare l'indice composto {'rack_name': 1, 'timestamp': 1}
. Con la stessa query, dovresti ottenere un numero di efficienza migliore.
Nota 3 :Nota che da allPlansExecution
è stato specificato, tutti le statistiche ti vengono debitamente restituite da MongoDB per completezza, mentre non hanno alcun rapporto con il nReturned
finale risultato. Era un piano rifiutato e il nReturned: 2
numero può essere confuso. Non vedrai queste statistiche se utilizzi executionStats
ambientazione. In primo luogo, allPlansExecution
viene utilizzato per la messa a punto e la determinazione del motivo per cui alcuni piani vengono rifiutati.