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

Forstå MongoDB-indekser

Blandt de opgaver, der er involveret i databasestyring, er at forbedre ydeevnen ved at anvende forskellige strategier. Indeksering er et af de tips, der forbedrer gennemstrømningsoperationer ved at lette dataadgang til forespørgselsanmodninger. Det gør det ved at minimere antallet af diskadgange, der kræves, når en forespørgsel behandles. Manglende brug af indekser i MongoDB vil tvinge databasen til at udføre en fuld samlingsscanning, det vil sige at scanne gennem alle dokumenterne i samlingen for at vælge dokumenter, der matcher en udstedt forespørgselserklæring. Det vil naturligvis tage meget tid, især hvis der er så mange dokumenter involveret. I en nøddeskal understøtter indekser effektiv udførelse af forespørgsler.

MongoDB-indekser

Da vi forventer at gemme mange dokumenter i en MongoDB-samling, er vi nødt til at finde en måde at gemme en lille del af data for hvert dokument i en anden partition for nem gennemgang ved brug af indekser. Et indeks vil gemme en eller flere specifikke felter og derefter sortere disse data i rækkefølge efter værdien af ​​det pågældende felt. Med denne bestilling understøttes effektiv forespørgselsmatchning og områdebaserede forespørgselsoperationer. Indekser er defineret på samlingsniveau, og de understøttes af ethvert felt eller indlejret felt i dokumenterne i samlingen.

Når du opretter et dokument, tildeler MongoDB som standard et _id-felt, hvis det ikke er angivet, og gør dette til et unikt indeks for det pågældende dokument. Grundlæggende er dette for at forhindre, at det samme dokument indsættes mere end én i samlingen. For en sharded cluster er det desuden tilrådeligt at bruge dette _id-felt som en del af shard-nøglervalget, ellers skal der være en vis unikhed af data i _id-feltet for at undgå fejl.

Oprettelse af et indeks for en samling

Forudsat at du har indsat nogle data i din samling, og du vil tildele et felt til at være et indeks, kan du bruge createIndex-metoden til at opnå dette, dvs.

Lad os sige, at du har disse json-data:

{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

Vi kan gøre feltet Navn til et faldende indeks ved at:

db.collection.createIndex({Name: -1})

Denne metode opretter et indeks med samme specifikation, hvis det bare ikke allerede eksisterer.

Typer af indekser i MongoDB

MongoDB involverer forskellige typer data, og derfor udledes forskellige typer indekser for at understøtte disse datatyper og forespørgsler.

  1. Enkelt felt

    Ved at bruge et enkelt felt i et dokument kan man gøre feltet til et indeks på en stigende eller faldende måde ligesom eksemplet ovenfor. Desuden kan du oprette et indeks på et indlejret dokument som helhed, for eksempel:

    { 
        _id: “xyz”,
        Contact:{
            email: “[email protected]”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    Kontaktfelt er et indlejret dokument, så vi kan gøre det til et stigende indeks med kommandoen:

    db.collection.createIndex({ Contact: 1})

    I en forespørgsel kan vi hente dokumentet som:

    db.collection.find({ 
        Contact: {email: “[email protected]”,
        phone:”+420 78342823”} 
    })

    En bedste praksis er at oprette indekset i baggrunden, især når en stor mængde data er involveret, da applikationen skal have adgang til dataene, mens indekset bygges.

  2. Sammensat indeks

    Sammensatte indekser bruges ofte til at lette sorteringsoperationen i en forespørgsel og understøtte forespørgsler, der matcher flere felter. Syntaksen for at skabe et sammensat indeks er:

    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    Oprettelse af et sammensat indeks for eksempeldataene nedenfor

    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    Overvejelser:

    • En grænse på kun 32 felter kan understøttes.
    • Værdien af ​​feltet vil definere typen af ​​indeks, dvs. 1 er stigende og -1 er faldende.
    • Opret ikke sammensatte indekser, der har hashed indekstype.
    • Rækkefølgen af ​​felter i et sammensat indeks er vigtig. Sorteringen vil ske i overensstemmelse med rækkefølgen af ​​felterne.
  3. Multikey-indeks

    På et tidspunkt kan du have felter med lagret matrixindhold. Når disse felter indekseres, oprettes separate indeksposter for hvert element. Det hjælper derfor en forespørgsel at vælge dokumenter, der består af arrays ved at matche på element eller elementer i arrays. Dette gøres automatisk af MongoDB, og det er derfor ikke nødvendigt for en eksplicit at specificere multikey-typen. Fra version 3.4 sporer MongoDB, hvilke indekserede felter der forårsager, at et indeks er et multikey-indeks. Med denne sporing får databaseforespørgselsmotoren tilladelse til at bruge strammere indeksgrænser.

    Begrænsninger af Multikey Index

    • Kun ét matrixfelt kan bruges i multikey-indeksering for et dokument i samlingen. dvs. Du kan ikke oprette et multikey-indeks for kommandoen og dataene nedenfor
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      Du kan ikke oprette et multikey-indeks
      { nums: 1, scores: 1 } 
    • Hvis multikey-indekset allerede eksisterer, kan du ikke indsætte et dokument, der overtræder denne begrænsning. Det vil sige, hvis vi har
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      Efter at have oprettet et sammensat multikey-indeks, et forsøg på at indsætte et dokument, hvor både tal- og scorefelter er arrays, vil databasen mislykkes med indsættelsen.
  4. Tekstindekser

    Tekstindekser bruges ofte til at forbedre søgeforespørgsler efter en streng i en samling. De gemmer ikke sprogspecifikke stopord (dvs. "det", "et", "eller"). En samling kan højst have ét tekstindeks. Sådan opretter du et tekstindeks:

    db.collection.createIndex({Name:”text”})

    Du kan også indeksere flere felter, dvs.

    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    Et sammensat indeks kan indeholde en tekstindeksnøgle i kombination med den stigende/faldende indeksnøgle, men:

    • Alle tekstindeksnøgler skal være tilstødende i indeksspecifikationsdokumentet, når du opretter et sammensat tekstindeks.
    • Ingen andre specielle indekstyper såsom flernøgleindeksfelter bør være involveret i det sammensatte tekstindeks.
    • For at udføre en $text-søgning skal forespørgselsprædikatet indeholde betingelser for lighedsmatch på de foregående nøgler.
  5. Hashede indekser

    Sharding er en af ​​de teknikker, der bruges i MongoDB til at forbedre vandret skalering. Sharding involverer ofte hash-baseret koncept ved brug af hash-indekser. Den mere tilfældige fordeling af værdier langs deres område er skildret af disse indekser, men understøtter kun lighedsmatch og kan ikke understøtte områdebaserede forespørgsler.

Overordnede operationelle overvejelser for indekser

  • Hvert indeks kræver mindst 8 kB dataplads.
  • Når det er aktivt, vil hvert indeks forbruge noget diskplads og hukommelse. Dette er vigtigt, når det spores i kapacitetsplanlægning.
  • For en samling med et højt læse-til-skrive-forhold forbedrer yderligere indekser ydeevnen og påvirker ikke uindekserede læseoperationer.

Begrænsninger ved brug af indekser

  • Tilføjelse af et indeks har en negativ indvirkning på ydeevnen for skriveoperationer, især for samlinger med det høje skrive-til-læse-forhold. Indekser vil være dyre, idet hver indsættelse også skal opdatere ethvert indeks.
  • MongoDB vil ikke oprette, opdatere et indeks eller indsætte i en indekseret samling, hvis indeksindgangen for et eksisterende dokument overskrider indeksnøglegrænsen.
  • For eksisterende sharded-samlinger vil chunk-migrering mislykkes, hvis chunken har et dokument, der indeholder et indekseret felt, der har en indeksindgang, der overskrider indeksnøglegrænsen.

Konklusion

Der er så mange måder at forbedre MongoDB-ydeevne på, og indeksering er en af ​​dem. Indeksering letter forespørgselsoperationer ved at reducere latens, som data hentes over, ved på en eller anden måde at minimere antallet af dokumenter, der skal scannes. Der er dog nogle overvejelser, man skal gøre sig, før man beslutter sig for at bruge en bestemt type indeks. Samlinger med højt læse-til-skrive-forhold har en tendens til at udnytte indekser bedre end samlinger med høje skrive-til-læse-operationer.


  1. Hvordan får man objekt-id'et i PyMongo efter en indsættelse?

  2. Sådan får du dagen, måneden og året fra en dato i SQL

  3. Hvordan udfører man effektivt distinkt med flere nøgler?

  4. Mongo-id'er fører til skræmmende URL'er