I allmänhet kommer du att vilja sätta ett index på de fält som används mest som filterkriterier i dina viktigaste/frekventa frågor, och börja med de mest selektiva fälten först. Det finns ganska bra vägledning om ämnet som en del av MongoDB-dokumentationen
. Ett uttalande av särskilt intresse för ditt fall är förmodligen detta eftersom du har många $or
s:
Det viktigaste här är dock att mäta, mäta, mäta och titta på exekveringsplaner med hjälp av explain() . Anledningen är att du med största sannolikhet kommer att ha olika typer av frågor som din applikation behöver stödja och du kommer att behöva gå på en avvägning någon gång där du måste välja mellan indexunderhållskostnader (t.ex. skrivlås under indexuppdateringar och diskutrymmeskrav) och den teoretiskt snabbaste lösningen där alla fält som används i en enda fråga täcks av ett enda index.
Hela det där indexeringsämnet är lite flummigt vilket beror mycket på ditt exakta scenario:
- Är dina data kraftigt uppdaterade och behöver skrivningar vara supersnabb (du vill ha färre/mindre index) eller är din data ganska stabil med frekventa läsningar som måste vara snabba (gå med fler/större index)?
- Vilka typer av frågor behöver du stödja? Hur lika är de när det gäller deras filter? Kommer vissa kombinationer av filter att vara mer sannolika än andra? Vilka frågor måste fungera bra, vilka kan vara lite långsammare?
- Hur fördelas data i dina potentiellt indexerade fält?
- och så vidare...
Du hittar inte det enda indexet som hjälper alla dina frågor att prestera bäst. Och även, när du lägger till fler index eller ändrar befintliga, kan detta göra att frågeoptimeraren slutar använda något index för vissa frågor och istället väljer en annan exekveringsplan som kanske inte är önskvärd. Så mät allt som är viktigt vid varje förändring av din indexering eller fysiska datalayout (hårdvaruinstallation, skärning...). Slutligen bör du mäta din frågeprestanda regelbundet när din mängd data växer såvida den inte är förutsägbart enhetlig i sin distribution.
För att göra en lång historia kort:Välj ett iterativt tillvägagångssätt och börja med att lägga till ett index (jag skulle föreslå att du lägger till ett på isBlockedByAdmin
, isDelete
och information.shares.userId
) mät sedan din frågeprestanda och förfina sedan ditt index baserat på dina resultat (och igen, och igen, ...).