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

En oversigt over databaseindeksering for MongoDB

Hvad er indeksering?

Indeksering er et vigtigt begreb i databaseverdenen. Den største fordel ved at oprette indeks på ethvert felt er hurtigere adgang til data. Det optimerer processen med databasesøgning og -adgang. Overvej dette eksempel for at forstå dette.

Når en bruger beder om en specifik række fra databasen, hvad vil DB-systemet så gøre? Den starter fra første række og tjekker, om det er den række, brugeren ønsker? Hvis ja, så returner den række, ellers fortsæt med at søge efter rækken til slutningen.

Generelt, når du definerer et indeks på et bestemt felt, vil DB-systemet oprette en ordnet liste over det felts værdi og gemme det i en anden tabel. Hver indtastning af denne tabel vil pege på de tilsvarende værdier i den oprindelige tabel. Så når brugeren forsøger at søge efter en række, vil den først søge efter værdien i indekstabellen ved hjælp af binær søgealgoritme og returnere den tilsvarende værdi fra den oprindelige tabel. Denne proces vil tage kortere tid, fordi vi bruger binær søgning i stedet for lineær søgning.

I denne artikel vil vi fokusere på MongoDB-indeksering og forstå, hvordan man opretter og bruger indekser i MongoDB.

Hvordan opretter man et indeks i MongoDB Collection?

For at oprette indeks ved hjælp af Mongo shell, kan du bruge denne syntaks:

db.collection.createIndex( <key and index type specification>, <options> )

Eksempel:

Sådan oprettes indeks på navnefelt i myColl-samling:

db.myColl.createIndex( { name: -1 } )

Typer af MongoDB-indekser

  1. Standard _id-indeks

    Dette er standardindekset, som vil blive oprettet af MongoDB, når du opretter en ny samling. Hvis du ikke angiver nogen værdi for dette felt, vil _id som standard være primær nøgle for din samling, så en bruger ikke kan indsætte to dokumenter med samme _id feltværdier. Du kan ikke fjerne dette indeks fra _id-feltet.

  2. Enkeltfeltindeks

    Du kan bruge denne indekstype, når du vil oprette et nyt indeks på et hvilket som helst andet felt end _id-feltet.

    Eksempel:

    db.myColl.createIndex( { name: 1 } )

    Dette vil oprette et enkelt stigende indeks på navnefeltet i myColl-samlingen

  3. Sammensat indeks

    Du kan også oprette et indeks på flere felter ved hjælp af sammensatte indekser. For dette indeks er rækkefølgen af ​​felterne, hvor de er defineret i indekset, afgørende. Overvej dette eksempel:

    db.myColl.createIndex({ name: 1, score: -1 })

    Dette indeks vil først sortere samlingen efter navn i stigende rækkefølge, og derefter for hver navneværdi vil den sortere efter scoreværdier i faldende rækkefølge.

  4. Multikey-indeks

    Dette indeks kan bruges til at indeksere matrixdata. Hvis et felt i en samling har et array som værdi, kan du bruge dette indeks, som vil oprette separate indeksposter for hvert element i array. Hvis det indekserede felt er et array, vil MongoDB automatisk oprette Multikey-indeks på det.

    Overvej dette eksempel:

    {
    ‘userid’: 1,
    ‘name’: ‘mongo’,
    ‘addr’: [
        {zip: 12345, ...},
    {zip: 34567, ...}
    ]
    }

    Du kan oprette et Multikey-indeks på addr-feltet ved at udstede denne kommando i Mongo-shell.

    db.myColl.createIndex({ addr.zip: 1 })
  5. Geospatialt indeks

    Antag, at du har gemt nogle koordinater i MongoDB-samlingen. For at oprette indeks på denne type felter (som har geospatiale data), kan du bruge et geospatialt indeks. MongoDB understøtter to typer geospatiale indekser.

    • 2D-indeks:Du kan bruge dette indeks til data, der er gemt som punkter på 2D-plan.

      db.collection.createIndex( { <location field> : "2d" } )
    • 2dsphere Index:Brug dette indeks, når dine data er gemt som GeoJson-format eller koordinatpar (længdegrad, breddegrad)

    db.collection.createIndex( { <location field> : "2dsphere" } )
  6. Tekstindeks

    For at understøtte forespørgsler, som omfatter søgning efter noget tekst i samlingen, kan du bruge Tekstindeks.

    Eksempel:

    db.myColl.createIndex( { address: "text" } )
  7. Hashed Index

    MongoDB understøtter hash-baseret sharding. Hashed indeks beregner hashen af ​​værdierne i det indekserede felt. Hashed indeks understøtter sharding ved hjælp af hashed sharded nøgler. Hashed sharding bruger dette indeks som shard nøgle til at opdele dataene på tværs af din klynge.

    Eksempel:

    db.myColl.createIndex( { _id: "hashed" } )
Indeksets egenskaber
  1. Unikt indeks

    Denne egenskab sikrer, at der ikke er dublerede værdier i det indekserede felt. Hvis der findes dubletter under oprettelse af indekset, vil det kassere disse poster.

  2. Sparse Index

    Denne egenskab sikrer, at alle forespørgsler søger i dokumenter med indekseret felt. Hvis et dokument ikke har et indekseret felt, vil det blive kasseret fra resultatsættet.

  3. TTL-indeks

    Dette indeks bruges til automatisk at slette dokumenter fra en samling efter et bestemt tidsinterval (TTL) . Dette er ideelt til at fjerne dokumenter fra hændelseslogfiler eller brugersessioner.

Performanceanalyse

Overvej en samling af elevresultater. Den har præcis 3000000 dokumenter. Vi har ikke oprettet nogen indekser i denne samling. Se dette billede nedenfor for at forstå skemaet.

Eksempeldokumenter i partitursamling

Overvej nu denne forespørgsel uden nogen indekser:

db.scores.find({ student: 585534 }).explain("executionStats")

Denne forespørgsel tager 1155ms at udføre. Her er outputtet. Søg efter executionTimeMillis-feltet for resultatet.

Udførelsestid uden indeksering

Lad os nu oprette indeks på elevfelt. For at oprette indekset skal du køre denne forespørgsel.

db.scores.createIndex({ student: 1 })

Nu tager den samme forespørgsel 0 ms.

Udførelsestid med indeksering

Man kan tydeligt se forskellen i udførelsestid. Det er næsten øjeblikkeligt. Det er styrken ved indeksering.

Konklusion

En oplagt takeaway er:Opret indekser. Baseret på dine forespørgsler kan du definere forskellige typer indekser på dine samlinger. Hvis du ikke opretter indekser, vil hver forespørgsel scanne de fulde samlinger, hvilket tager meget tid, hvilket gør din applikation meget langsom, og den bruger masser af ressourcer på din server. På den anden side skal du heller ikke oprette for mange indekser, fordi oprettelse af unødvendige indekser vil medføre ekstra tid overhead for al indsættelse, sletning og opdatering. Når du udfører nogen af ​​disse operationer på et indekseret felt, så skal du også udføre den samme operation på indekstræet, hvilket tager tid. Indekser gemmes i RAM, så oprettelse af irrelevante indekser kan æde din RAM-plads op og sænke din server.


  1. show dbs giver ikke autoriseret til at udføre kommandofejl

  2. Php7 Redis Client på Alpine OS

  3. Timeout udfører SET {Key}, inst:0, mgr:Inaktiv, kø:2, qu=1, qs=1, qc=0, wr=1/1, in=0/0

  4. Importer CSV-data som et array i MongoDB ved hjælp af mongoimport