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

MongoDB/Mongoose-indeks gør forespørgslen hurtigere eller sænker den?

Du læser det forkert

Du misforstår hensigten med den citerede blok der med hensyn til hvad .ensureIndex() ( nu forældet, men stadig kaldet af mongoose-kode ) gør det faktisk her i sammenhængen.

I mongoose definerer du et indeks enten på skema- eller modelniveau, alt efter hvad der passer til dit design. Hvad mongoose "automatisk" gør for dig, er ved forbindelse, at den inspekterer hver registreret model og kalder derefter den relevante .ensureIndex() metoder til de angivne indeksdefinitioner.

Hvad gør dette egentlig?

Nå, i de fleste tilfælde, efter at du allerede har startet din applikation før og code>.ensureIndex() metoden, der blev kørt, er Absolut ingenting . Det er lidt af en overdrivelse, men det er mere eller mindre sandt.

Fordi indeksdefinitionen allerede er oprettet på serversamlingen, gør et efterfølgende kald ikke noget. Dvs., det taber ikke indekset og "genopretter". Så den reelle omkostning er stort set ingenting, når først selve indekset er oprettet.

Oprettelse af indekser

Så da mongoose kun er et lag oven på standard-API'en, er createIndex() metoden indeholder alle detaljer om, hvad der sker.

Der er nogle detaljer at overveje her, såsom at et indeksbyggeri kan ske i "baggrunden", og selvom dette er mindre påtrængende for din applikation, kommer det på sin egen regning. Især at indeksstørrelsen fra "baggrunds"-generering vil være større, end hvis du byggede den i forgrunden, hvilket blokerer andre operationer.

Alle indekser har også en omkostning, især i form af diskbrug samt en ekstra omkostning ved at skrive de yderligere oplysninger uden for selve indsamlingsdataene.

Fordelene ved et indeks er, at det er meget hurtigere at "søge" efter værdier indeholdt i et indeks end at gennemsøge hele samlingen og matche de mulige betingelser.

Disse er de grundlæggende "afvejninger" forbundet med indekser.

Implementeringsmønster

Tilbage til den citerede blok ud fra dokumentationen er der en reel hensigt bag dette råd.

Det er typisk i implementeringsmønstre og især ved datamigrering at gøre tingene i denne rækkefølge:

  1. Fyld data til relevante samlinger/tabeller
  2. Aktiver indekser på de indsamlings-/tabeldata, der er relevante for dine behov

Dette skyldes, at der er en omkostning forbundet med oprettelse af indeks, og som tidligere nævnt er det ønskeligt at få den mest optimale størrelse fra indeksopbygningen, samt at undgå at hver dokumentindsættelse også har overhead til at skrive en indeksindtastning, når du er gør denne "indlæsning" i bulk.

Så det er det, indekser er til for, det er omkostningerne og fordelene, og budskabet i mongoose-dokumentationen er forklaret.

Generelt foreslår jeg dog, at du læser op på databaseindekser for hvad de er og hvad de gør. Tænk på at gå ind på et bibliotek for at finde en bog. Der er kartotek der ved indgangen. Går du rundt på biblioteket for at finde den bog, du vil have? Eller slår du det op i kartoteket for at finde ud af, hvor det er? Det indeks tog nogen tid at oprette og også holde det opdateret, men det sparer "dig" for tiden til at gå rundt i hele biblioteket, bare så du kan finde din bog.



  1. Mongodb:array element projektion med findOneAndUpdate virker ikke?

  2. mongoexport syntaks fejlmeddelelse

  3. mongodb samlede indlejrede dokumentværdier

  4. Meteor, definer samlinger dynamisk