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

Indice dell'intervallo di date Mongo con filtri

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 su creationDate e reportCount 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 e parent filtri. Questo interrogatorio provoca l'eliminazione di 37 documenti con conseguente restituzione di 19 documenti.

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.