sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo datumintervallsindex med filter

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 och reportCount 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 och parent filter. Detta förhör gör att 37 dokument kasseras vilket resulterar i att 19 dokument returneras.

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.




  1. MongoDB $toDate

  2. Fråga om datum för inlägg skapade de senaste 24 timmarna

  3. Hur aktiverar jag TLS för Redis 6 på Sidekiq?

  4. Hur söker jag efter strängar i redis?