Jobber med indekser i MongoDB

Det er velkjent at ressursene er svært begrenset i produksjonsmiljøer, og at det er sant at det nå er ti ganger kraftigere servere enn de som eksisterte for 5 år siden, men etter hvert som strømmen til disse datamaskinene har økt, så har spørringen til data.

Avhengig av hvor lang tid en spørring tar å kjøre, kan vi si om det er kritisk eller ikke, men selv om det ikke er kritisk er det alltid en liten forbedringsmargin, med dette vil vi spare sekunder med utførelse som ved slutten av dagen blir til minutter, noe som gir oss muligheten til å forbedre brukeropplevelsen.

KravFor å gjennomføre denne opplæringen trenger vi en funksjonell installasjon av MongoDB med tilstrekkelige tillatelser slik at vi kan jobbe i kommandokonsollen.

Vi trenger også en datasett eller dokumenter For å fylle samlingen vår tilbød vi i tidligere opplæringsprogrammer et første datasett, men for de som ikke har det, kan de bruke dette:

 db.guiamongo.insert ({"navn": "Maria", "alder": "25", "kjønn": "Kvinne", "land": "Colombia"}); db.guiamongo.insert ({"navn ":" Pedro "," age ":" 32 "," gender ":" Male "," country ":" Ecuador "}); db.guiamongo.insert ({" name ":" Ramon "," age " : "18", "gender": "Male", "country": "Honduras"}); db.guiamongo.insert ({"name": "John", "age": "22", "gender": "Mann", "land": "Argentina"}); db.guiamongo.insert ({"navn": "Rosa", "alder": "45", "kjønn": "Kvinne", "land": " Chile "," språk ": [" Esp "," Ing "," Fra "]});
Med dette vil vi ha nok til en liten start og dermed få resultater fra øvelsene som vi vil presentere nedenfor.

1. Indeksering av MongoDB


Indeksering eller arbeid med indekser er et konsept som deles i MongoDB med Databaser relasjonelt, det vil si at hvis vi har en forestilling om dette konseptet, kan vi forstå hvordan det fungerer i MongoDB før lenge må vi bare holde oss til den spesifikke syntaksen.

Jobber med indekserHvis vi er fremmede for konseptet, bør det bemerkes at arbeidet med indekser er ikke noe mer enn å spesifisere til Database hvilke felt du bør bruke i minnet for å gjøre søket ditt mer effektivt, for eksempel hvis vi søker etter en stor samling dokumenter for et felt som heter Navn, det ideelle ville være å indeksere dette feltet slik at motoren vet at det bør styres direkte av feltet, ved å gjøre det, begynner spørringene som bruker feltet å være raskere.

For å lage en indeks på MongoDB det vi bør gjøre er å bruke funksjonen sikreIndex () og som parameter passere et dokument JSON som angir feltene eller egenskapene til dokumentet vårt som vi må overholde indeksen med. La oss se på et lite eksempel på dette.

Anta at vi har en samling som heter guiamongo og vi søker etter et felt som heter navn, koden vil være denne:

 db.guiamongo.find ({“name”: “Name”})
Dette er en vanlig spørring som ikke har noe spesielt, det eneste problemet er at hvis det er millioner av dokumenter, ville det gå veldig sakte, så for å lage en indeks må vi bare spesifisere den som følger:
 db.guiamongo.ensureIndex ({“navn”: 1})
Med dette har vi allerede opprettet indeksen for spørringen, hvis vi utfører det igjen, vil det være mye raskere. La oss se hvordan dette ser ut på konsollen vår MongoDB:

Vi kan legge merke til at når vi først har opprettet indeksen, MongoDB Det gir oss et dokument der det indikerer statusen til funksjonen vår og hvor mange indekser vi hadde før og etter applikasjonen, og viser oss i tillegg feltet greit på 1 som indikerer at kjøringen var vellykket.

Den forrige spørringen er ganske nyttig for et enkelt felt, men hvis vi gjør følgende:

 db.guiamongo.find ({"name": "Name", "age": {"$ gt": "20"}}). sort ({"age": - 1});
Vi innser at i dette tilfellet indeks Den forrige fungerer ikke lenger, dette er fordi spørringen bruker en annen kombinasjon av felt for søket, det er derfor vi må lage en ny indeks ved å bruke det vi lærte tidligere, la oss se hvordan det ville være:
 db.guiamongo.ensureIndex ("navn": 1, "alder": 1);
Hvis vi sjekker databasen vår som følger, vil vi se at vi har en ny indeks i samlingen:

2. Ulempe ved bruk av indekser


Til tross for de store fordelene som bruken og jobben med indekserDisse er ikke alltid fordelaktige, det er derfor vi må analysere grundig før vi implementerer denne funksjonen i vår database.

Største ulempenDe stor ulempe ved bruk av indekser er at motoren må inkludere de nye dataene vi setter inn i tabellen eller listen over indekser, av denne grunn hver gang en funksjon gjøres sett inn () en rekke tilgrensende prosesser vil bli opprettet som kan øke disk- og behandlingsbruken.

En annen ulempe er at vi har et maksimum på 64 indekser per samling, Det er derfor vi må jobbe med minst mulig av dem i databasen vår, og dermed sikre at det som er strengt nødvendig er det som brukes.

3. Hvordan vite når du skal bruke en indeks


Siden vi kjenner begrensningene og ulempene ved bruk av indekser, er en god øvelse å vite om vi skal lage dem eller ikke å ta denne serien med spørsmål, hvis vi kan svare på dem alle, har vi de nødvendige egenskapene for å lage en indeks, på På den annen side, hvis vi ikke kan, må vi analysere situasjonen fra et annet synspunkt, la oss se på spørsmålene:

Hvilke spørsmål gjør vi?Vi må utføre en analyse av situasjonen og se hva som skjer i samlingen vår, med dette vil vi finne ut om vi trenger indekser, eller hvis ikke, kanskje vi må eliminere noen.

Hva er den riktige orienteringen til indeksene?Vi trenger å vite hvordan vi bestiller dataene i indeksene, hvis det er alfabetisk eller numerisk, stigende eller synkende, påvirker dette direkte hastigheten for indeksering.

Hvordan vil den skalere?Vi må tenke på veksten av dataene våre, siden vi på denne måten vet om det som fungerer i dag i morgen med 10 eller 100 ganger flere data vil fungere skikkelig.

Selvfølgelig er dette bare en veiledning, det er spesielle og helt spesielle tilfeller for hver applikasjonsadministrator der du må anvende kriteriene dine for denne typen opplæringsprogrammer, men det er en god guide for å starte oss i en verden av dataoptimalisering.

4. Indekser i innebygde dokumenter


Strukturen av dokumenter som vi kan håndtere i MongoDB egner seg til kompleks datalagring, ikke alle dataene vi trenger vil være på samme nivå, det er derfor behovet for å lage innebygde dokumentindekser. Med disse indeksene MongoDB Du vil kunne indeksere data som har mer komplekse strukturer.

For å oppnå et resultat vil vi bruke det som kalles prikknotasjon, som ikke er mer enn å få tilgang til feltene i de innebygde dokumentene som om de var egenskaper til et objekt gjennom et punkt. I det følgende eksemplet vil vi lage en indeks for disse egenskapene, la oss først se syntaksen.

Først skal vi sette inn en post med et innebygd dokument i testdatasettet vårt:

 db.guiamongo.insert ({"name": "Juan", "age": "40", "gender": "Male", "country": "Brazil", "qualifications": {"history": "85 "," literature ":" 90 "," course ":" 3 "}});
Deretter skal vi gjøre en enkel forespørsel i dette tilfellet for kurseiendommen:
 db.guiamongo.find ({“ratings.course”: ”3”});
Hvis vi ønsker å lage en indeks, må vi bare gjøre følgende:
 db.guiamongo.ensureIndex ({“grade.course”: 1});
Med dette har vi allerede opprettet en indeks for et dokument innebygd i et annet i en samling i MongoDB. Hvis vi ser på dette er det vi burde ha fått i konsollen:

5. Bruk forklare ()


Siden vi vet hvordan vi lager indekser, og vi har en ide om når og hvorfor vi skal lage dem, har vi imidlertid ennå ikke sett et verktøy som er veldig viktig, et som lar oss vite litt mer og gå videre i våre spørsmål; Vi henviser til forklare () denne funksjonen lar oss vite klokkeslettet og indeksene som brukes i spørringene.

Hva forteller det oss?Retur av forklare () Det er et dokument der det vil indikere markøren som det bruker for søket, så angir det grensene for indeksen, vi har også et felt som har navnet millis og det vil indikere tiden i milli-sekunder som det tar en spørring å utføre, sistnevnte er veldig viktig når vi forstår ytelsen til våre Database.

La oss se hvordan vi kan bruke denne funksjonen til en spørring, vi skal bruke den vi gjorde i vårt forrige eksempel:

 db.guiamongo.find ({"ratings.course": "3"}). forklar ();
Etter søknaden skal den returnere noe som følgende:

Vi legger merke til hvordan data tilbys oss for å kunne analysere spørringen, i markøren vi ser at vi har brukt indeksen som vi opprettet i forrige øvelse karakterer. kurs_1, dette hjalp oss med å komme dit 0 milli-sekunder kjøringstid, som er den optimale tiden for våre forespørsler, åpenbart siden dette er et testmiljø, vil vi ikke ha noe utover det, men hvis vi kan gjøre denne øvelsen på servere med millioner av poster, vil vi innse kraften til indekser.

Med dette har vi fullført denne opplæringen, vi har laget indekser i våre dokumentsamlinger, og i tillegg har vi utforsket noen verktøy som hjelper oss å skaffe viktig informasjon for å forbedre og fremfor alt øke ytelsen til våre Database.

Du vil bidra til utvikling av området, dele siden med vennene dine

wave wave wave wave wave