Några viktiga punkter från utgången för förklara planen:
- Frågan adresserar följande attribut:
siteId, status, creationDate, reportCount, assignee, parent
- Den vinnande planen har två steg:
- IX_SCAN använder
creationDate_1_reportCount_1_label_1
, detta använder indexerade sökningar påcreationDate
ochreportCount
för att identifiera 56 dokument som sedan vidarebefordras till FETCH-stadiet - FETCH tar emot 56 dokument från IX_SCAN-stadiet och förhör sedan dessa dokument för att tillämpa
siteId
,status
,assignee
ochparent
filter. Detta förhör gör att 37 dokument kasseras vilket resulterar i att 19 dokument returneras.
- IX_SCAN använder
Så ditt index täcker bara 2 av de 6 attributen i din fråga och de återstående 4 attributen i din fråga tillämpas genom att granska dokumenten inte indexet . Om du vill att den här frågan ska vara helt indexerad, skapa följande index:
db.collection.createIndex(
{siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
)
Om du kör om med detta index på plats bör du upptäcka att (a) MongoDB väljer detta index och (b) antalet dokument som vidarebefordras av IX_SCAN-steget är detsamma som antalet dokument som returneras av ditt sökanrop.
Jag säger "bör hitta" eftersom det finns andra aspekter här som kan resultera i att MongoDB väljer ett annat index t.ex. användning av $nor
och sorteringsstadiet (creationDate: 1
). Jag skulle rekommendera att justera indexet och köra med förklara "på" efter varje justering och leta efter dessa nyckelobjekt i executionStats
underdokument:
- "nÅterlämnad"
- "totalKeysExamined"
- "totalDocsExamined"
En enkel tumregel är denna:ju närmare totalKeysExamined
är att nReturned
och ju närmare totalDocsExamined
är till noll ... ju bättre din indextäckning.
Det finns också frågan om kostnaden för ett index (i termer av inverkan på skrivtider och indexlagring) så jag skulle föreslå att du överväger dina icke-funktionella krav - kan dina önskade förflutna tider uppnås utan full indextäckning? Om inte, bör du fortsätta med empiriska tester men var beredd att justera ditt val som svar på vad explain()
utdata berättar.