MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Perché i diversi piani di query di MongoDB mostrano un valore nReturned diverso?

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.