sql >> Database >  >> NoSQL >> MongoDB

MongoDB/Mongoose-index query sneller maken of vertragen?

Je leest het verkeerd

Je leest de bedoeling van het geciteerde blok verkeerd over wat .ensureIndex() (nu verouderd, maar nog steeds aangeroepen door mangoestcode) doet het hier in de context.

In mangoest definieert u een index op schema- of modelniveau, afhankelijk van uw ontwerp. Wat mangoest "automatisch" voor u doet, is dat het bij verbinding elk geregistreerd model inspecteert en vervolgens de juiste .ensureIndex() aanroept methoden voor de opgegeven indexdefinities.

Wat doet dit eigenlijk?

In de meeste gevallen is dit nadat u uw applicatie al eerder hebt opgestart en de .ensureIndexes() methode is uitgevoerd is Absoluut niets . Dat is een beetje overdreven, maar het klopt min of meer.

Omdat de indexdefinitie al is gemaakt op de serververzameling, doet een volgende aanroep niets. Dat wil zeggen, het laat de index niet vallen en "opnieuw maken". Dus de echte kosten zijn eigenlijk niets, als de index zelf eenmaal is gemaakt.

Indices maken

Dus aangezien mangoest slechts een laag is bovenop de standaard API, is de createIndex() methode bevat alle details van wat er gebeurt.

Er zijn enkele details waarmee u rekening moet houden, zoals dat een indexopbouw op de "achtergrond" kan plaatsvinden, en hoewel dit minder opdringerig is voor uw toepassing, brengt het wel zijn eigen kosten met zich mee. Met name dat de indexgrootte van de "achtergrond"-generatie groter zal zijn dan wanneer u deze op de voorgrond zou bouwen, waardoor andere bewerkingen worden geblokkeerd.

Alle indexen brengen ook kosten met zich mee, met name in termen van schijfgebruik en extra kosten voor het schrijven van de aanvullende informatie buiten de collectiegegevens zelf.

De voordelen van een index zijn dat het veel sneller is om te "zoeken" naar waarden in een index dan om de hele collectie te doorzoeken en aan de mogelijke voorwaarden te voldoen.

Dit zijn de basis "trade-offs" geassocieerd met indexen.

Implementatiepatroon

Terug naar het geciteerde blok uit de documentatie blijkt dat er een echte bedoeling achter dit advies zit.

Het is typisch in implementatiepatronen en vooral bij datamigraties om dingen in deze volgorde te doen:

  1. Gegevens invullen in relevante collecties/tabellen
  2. Schakel indexen in voor de verzameling/tabelgegevens die relevant zijn voor uw behoeften

Dit komt omdat er kosten zijn verbonden aan het maken van indexen, en zoals eerder vermeld is het wenselijk om de meest optimale grootte uit de indexopbouw te halen, en om te voorkomen dat elke documentinvoeging ook de overhead heeft van het schrijven van een indexitem wanneer u dit in bulk "laden".

Daar zijn indexen dus voor, dat zijn de kosten en baten en de boodschap in de mangoestdocumentatie wordt uitgelegd.

In het algemeen raad ik echter aan om meer te lezen op Database-indexen voor wat ze zijn en wat ze doen. Denk aan wandelen in een bibliotheek om een ​​boek te vinden. Er is een kaartenbak daar bij de ingang. Loop je door de bibliotheek om het boek te vinden dat je zoekt? Of zoek je het op in de kaartindex om te zien waar het is? Het kostte iemand tijd om die index te maken en up-to-date te houden, maar het bespaart "u" de tijd om door de hele bibliotheek te lopen, zodat u uw boek kunt vinden.



  1. Hoe het aantal te vinden op basis van de conditie in MOngoDB Aggregation?

  2. Golang mgo krijgt lege objecten

  3. Null-waarden uitsluiten van Mongoose-vulquery's?

  4. Mongoose save() werkt de waarde niet bij in een array in het databasedocument