Alcuni punti chiave dell'output del piano di spiegazione:
- La query riguarda i seguenti attributi:
siteId, status, creationDate, reportCount, assignee, parent
- Il piano vincente prevede due fasi:
- IX_SCAN utilizza
creationDate_1_reportCount_1_label_1
, utilizza ricerche indicizzate sucreationDate
ereportCount
identificare 56 documenti che vengono poi inoltrati alla fase FETCH - FETCH riceve 56 documenti dalla fase IX_SCAN e quindi interroga questi documenti per applicare il
siteId
,status
,assignee
eparent
filtri. Questo interrogatorio provoca l'eliminazione di 37 documenti con conseguente restituzione di 19 documenti.
- IX_SCAN utilizza
Quindi, il tuo indice copre solo 2 dei 6 attributi nella tua query e i restanti 4 attributi nella tua query vengono applicati esaminando i documenti non l'indice . Se vuoi che questa query sia completamente coperta dall'indice, crea il seguente indice:
db.collection.createIndex(
{siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
)
Se esegui di nuovo questo indice, dovresti scoprire che (a) MongoDB sceglie questo indice e (b) il numero di documenti inoltrati dalla fase IX_SCAN è lo stesso del numero di documenti restituiti dalla tua chiamata di ricerca.
Dico "dovrebbe trovare" perché ci sono altri aspetti qui che potrebbero portare MongoDB a scegliere un indice diverso, ad es. uso di $nor
e la fase di ordinamento (creationDate: 1
). Consiglierei di modificare l'indice e di eseguire spiegare "on" dopo ogni modifica e di cercare questi elementi chiave in executionStats
sottodocumento:
- "nRestituito"
- "totalKeysExamined"
- "totalDocsExamined"
Una semplice regola pratica è questa:più vicino è il totalKeysExamined
è nReturned
e il più vicino totalDocsExamined
è zero... migliore sarà la copertura dell'indice.
C'è anche la questione del costo di un indice (in termini di impatto sui tempi di scrittura e archiviazione dell'indice), quindi suggerirei di considerare i tuoi requisiti non funzionali:i tempi trascorsi desiderati possono essere raggiunti senza la copertura completa dell'indice? In caso contrario, dovresti procedere con i test empirici, ma preparati a modificare la tua scelta in risposta a ciò che explain()
ti dice l'uscita.