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

mongodb-indekser, der dækker manglende værdier

Der er to relevante funktioner i et indeks, der tillader hurtige opslag (sammenlignet med at udføre en indsamlingsscanning):

  • Rækkefølge af værdier
  • Kompakthed af indekserede værdier

Hvis du har værdierne a og b , kan du sige at a kommer før b , leksikografisk. Hvis du har dokumenter {a: 2, b: 5} og {b: 4, a: 3} , er der ingen enkelt bestilling af disse dokumenter, der ville tilfredsstille typiske forespørgsler. For eksempel, hvis du vil have alle a værdier bestilt, så forventer du måske 2, 3 , men hvis du vil have b værdier, du kan forvente 4, 5 - kræver, at dokumentrækkefølgen vendes.

Når en database gemmer indekset på disken, gemmes værdierne i indeksrækkefølge (hvad det end måtte være for det pågældende indeks, f.eks. kollation påvirker dette). Generelt er der ingen enkelt bestilling, der er anvendelig til indsamlingsdokumenter generelt, derfor er indsamlingsdokumenter uordnede.

Når du forespørger efter indeks, tager du den værdi, der søges i, og udfører i det væsentlige en binær søgning ved hjælp af indekset, fordi dataene i indekset er sorteret.

Den anden grund til at bruge indekset er, hvis du scanner samlingen for hvert dokument, at hele dokumentet typisk skal hentes fra disken og springes over. Hvis du har en samling på 100 GB, og du laver en scanning, skal du muligvis springe over 100 GB data over. Hvis den samme samling har et 100 MB indeks på et felt (fordi indekset kun gemmer værdierne i det felt og ikke hele dokumentets værdi af data), og databasen udfører en komplet indeksscanning, skal den kun gennemløbe 100 MB af data.

Nu til dit spørgsmål om lagring af mangel på værdier i et indeks.

Fra indeksets synspunkt er "manglen på en værdi" i forskellige dokumenter den samme værdi. Du mister evnen til at lave binær søgning, når alle dine værdier er identiske. Så hvis du leder efter det "mangel på værdi" dokument, vil indekset give dig alle de dokumenter i samlingen, der mangler værdien tilbage, og så skal du alligevel lave en scanning gennem dem for at filtrere efter hvilke andre forhold, du har. Da dette generelt giver dårlig selektivitet, generer databaserne ikke indekser og laver samlingsscanninger i første omgang.

Og højst sandsynligt vil du have nogle andre felter ud af din forespørgsel, ikke det felt, der ikke har en værdi. Så nu vil du have indekset til at gemme komplette dokumenter, hvilket besejrer ideen om kompakthed.




  1. Hvordan fjerner man indlejret skemadokument i mongoose?

  2. Definering af et Mongoose-skema på farten fra en JSON-formateret 'beskrivelse'

  3. Sådan gemmer du en kompleks indlejret JSON i Redis ved hjælp af Python

  4. Hvad skal du vide, når du begynder at arbejde med MongoDB i produktionen - ti tips