sql >> Database >  >> NoSQL >> MongoDB

mongodb-indexen die ontbrekende waarden dekken

Er zijn twee relevante kenmerken van een index die snelle opzoekingen mogelijk maken (vergeleken met het uitvoeren van een collectiescan):

  • Orden van waarden
  • Compactheid van geïndexeerde waarden

Als je waarden a . hebt en b , kun je zeggen dat a komt voor b , lexicografisch. Als u documenten heeft {a: 2, b: 5} en {b: 4, a: 3} , is er geen enkele volgorde van deze documenten die zou voldoen aan typische vragen. Als u bijvoorbeeld alle a waarden geordend dan verwacht je 2, 3 , maar als je de b . wilt waarden die u zou verwachten 4, 5 - vereisen dat de documentvolgorde wordt omgekeerd.

Wanneer een database de index op schijf opslaat, worden de waarden opgeslagen in indexvolgorde (wat dat ook mag zijn voor de specifieke index, bijvoorbeeld collatie heeft hier invloed op). Over het algemeen is er geen enkele bestelling die bruikbaar is voor incassodocumenten in het algemeen, daarom zijn incassodocumenten ongeordend.

Wanneer u op index zoekt, neemt u de waarde die wordt gezocht en voert u in wezen een binaire zoekopdracht uit met behulp van de index, omdat de gegevens in de index zijn gesorteerd.

De tweede reden om de index te gebruiken, is dat als u de collectie scant, voor elk document het hele document moet worden opgehaald van de schijf en moet worden overgeslagen. Als u een verzameling van 100 GB heeft en u scant, moet u mogelijk meer dan 100 GB aan gegevens overslaan. Als dezelfde collectie een index van 100 MB heeft op een bepaald veld (omdat de index alleen de waarden in dat veld opslaat en niet de gegevens van het hele document), en de database een volledige indexscan uitvoert, hoeft deze slechts 100 MB aan gegevens.

Nu, op uw vraag over het opslaan van gebrek aan waarden in een index.

Vanuit het standpunt van de index is het "gebrek aan een waarde" in verschillende documenten dezelfde waarde. U verliest de mogelijkheid om binair te zoeken wanneer al uw waarden identiek zijn. Dus als u op zoek bent naar dat document met "gebrek aan waarde", geeft de index u alle documenten in de collectie terug die de waarde niet hebben, en dan moet u ze toch doorzoeken om te filteren op welke andere voorwaarden u ook heeft hebben. Aangezien dit over het algemeen een slechte selectiviteit oplevert, houden de databases zich niet bezig met indexen en voeren ze in de eerste plaats collectiescans uit.

En hoogstwaarschijnlijk wilt u enkele andere velden uit uw zoekopdracht, niet het veld dat geen waarde heeft. Dus nu wil je dat de index volledige documenten opslaat, waardoor het idee van compactheid teniet wordt gedaan.




  1. Hoe kunnen Redis-lijsten worden gebruikt om een ​​chatsysteem te implementeren?

  2. PHP kan MongoDB-stuurprogramma niet vinden

  3. hoe de aanmaakdatum van object-ID in mangoest te krijgen?

  4. Redis op Spark:Taak niet serialiseerbaar