Arbejde med indekser i MongoDB

Det er velkendt, at ressourcerne er meget begrænsede i produktionsmiljøer, og at det er rigtigt, at der nu er ti gange mere kraftfulde servere end dem, der eksisterede for 5 år siden, men i takt med at disse computers magt er steget, så er forespørgslen efter data.

Afhængigt af hvor lang tid en forespørgsel tager at køre, kan vi sige, om det er kritisk eller ej, men selvom det ikke er kritisk, er der altid en lille forbedringsmargen, med dette vil vi spare sekunders udførelse, der ved slutningen af ​​dagen omdannes til minutter, hvilket giver os mulighed for at forbedre brugeroplevelsen.

KravFor at kunne udføre denne vejledning har vi brug for en funktionel installation af MongoDB med tilstrækkelige tilladelser, så vi kan arbejde i kommandokonsollen.

Vi har også brug for en datasæt eller dokumenter For at udfylde vores samling tilbød vi i tidligere tutorials et indledende datasæt, men for dem, der ikke har det, kan de bruge dette:

 db.guiamongo.insert ({"navn": "Maria", "alder": "25", "køn": "Kvinde", "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": "Mand", "land": "Argentina"}); db.guiamongo.insert ({"navn": "Rosa", "alder": "45", "køn": "Kvinde", "land": " Chile "," sprog ": [" Esp "," Ing "," Fra "]});
Med dette vil vi have nok til en lille start og dermed opnå resultater fra de øvelser, som vi vil præsentere nedenfor.

1. Indeksering af MongoDB


Indeksering eller arbejde med indekser er et begreb, der deles i MongoDB med Databaser relationel, det vil sige, hvis vi har en forestilling om dette koncept, kan vi forstå, hvordan det fungerer i MongoDB inden længe skal vi simpelthen holde os til den særlige syntaks.

Arbejde med indekserHvis vi er fremmede for konceptet, skal det bemærkes, at arbejde med indeks er intet mere end at specificere til Database hvilke felter du skal bruge i hukommelsen for at gøre din søgning mere effektiv, for eksempel hvis vi forespørger på en stor samling dokumenter til et felt kaldet Navn, det ideelle ville være at indeksere dette felt, så motoren ved, at det skal styres direkte af dette felt, ved at gøre det, begynder de forespørgsler, der bruger dette felt, at være hurtigere.

For at oprette et indeks på MongoDB hvad vi skal gøre er at bruge funktionen sikreIndex () og som parameter sende et dokument JSON angiver felterne eller egenskaberne i vores dokument, som vi skal overholde indekset med. Lad os se på et lille eksempel på dette.

Antag, at vi har en samling kaldet guiamongo og vi søger efter et felt, der hedder navn, vil koden være denne:

 db.guiamongo.find ({“navn”: “Navn”})
Dette er en normal forespørgsel, der ikke har noget særligt, det eneste problem er, at hvis der er millioner af dokumenter, ville det være meget langsomt, så for at oprette et indeks skal vi kun angive det som følger:
 db.guiamongo.ensureIndex ({“navn”: 1})
Med dette har vi allerede oprettet indekset for forespørgslen, hvis vi udfører det igen, vil det være meget hurtigere. Lad os se, hvordan det ser ud på vores konsol MongoDB:

Vi kan bemærke, at når vi opretter indekset, MongoDB Det returnerer et dokument til os, hvor det angiver status for vores funktion, og hvor mange indekser vi havde før og efter applikationen, og viser os desuden feltet okay kl. 1, hvilket angiver, at udførelsen var vellykket.

Den forrige forespørgsel er ganske nyttig for et enkelt felt, men hvis vi gør følgende:

 db.guiamongo.find ({"name": "Name", "age": {"$ gt": "20"}}). sort ({"age": - 1});
Vi er klar over, at i dette tilfælde indeks Den forrige fungerer ikke længere, det er fordi forespørgslen bruger en anden kombination af felter til søgningen, derfor skal vi lave et nyt indeks ved hjælp af det, vi har lært tidligere, lad os se, hvordan det ville være:
 db.guiamongo.ensureIndex ("navn": 1, "alder": 1);
Hvis vi nu tjekker vores database som følger, vil vi se, at vi har et nyt indeks i samlingen:

2. Ulempe ved brug af indekser


På trods af de store fordele, som brugen og arbejdet med indeksDisse er ikke altid gavnlige, derfor skal vi analysere grundigt, før vi implementerer denne funktion i vores database.

Største ulempeDet stor ulempe ved brug af indekser er, at motoren skal inkorporere de nye data, som vi indsætter i tabellen eller listen over indekser, derfor hver gang der laves en funktion indsæt () der oprettes en række tilstødende processer, der kan øge disk- og behandlingsforbruget.

En anden ulempe er, at vi har et maksimum på 64 indekser pr. Samling, Derfor skal vi arbejde med den mindst mulige mængde af dem i vores database og dermed sikre, at det, der er strengt nødvendigt, er det, der bruges.

3. Sådan ved du, hvornår du skal bruge et indeks


Da vi kender begrænsningerne og ulemperne ved brug af indekser, er en god øvelse at vide, om vi skal oprette dem eller ej, at tage denne række spørgsmål, hvis vi kan besvare dem alle, har vi de nødvendige egenskaber for at oprette et indeks, på på den anden side, hvis vi ikke kan, bliver vi nødt til at analysere situationen fra et andet synspunkt, lad os se på spørgsmålene:

Hvilke forespørgsler laver vi?Vi er nødt til at foretage en analyse af situationen og se, hvad der sker i vores samling, med dette finder vi ud af, om vi har brug for indekser, eller hvis ikke, måske er vi nødt til at fjerne nogle.

Hvad er indeksernes korrekte orientering?Vi skal vide, hvordan vi ordner dataene i indekserne, hvis det er alfabetisk eller numerisk, stigende eller faldende, påvirker dette direkte hastigheden for indeksering.

Hvordan vil den skalere?Vi skal tænke på væksten af ​​vores data, da vi på denne måde ved, om det, der fungerer i dag i morgen med 10 eller 100 gange flere data, vil fungere korrekt.

Selvfølgelig er dette kun en vejledning, der er særlige og helt særlige tilfælde for hver applikationsadministrator, hvor du skal anvende dine kriterier over denne type tutorials, men det er en god guide til at starte os i en verden af ​​dataoptimering.

4. Indekser inden for integrerede dokumenter


Strukturen af ​​dokumenter, som vi kan håndtere i MongoDB egner sig til kompleks datalagring, ikke alle de data, vi har brug for, vil være på samme niveau, derfor er behovet for at oprette integrerede dokumentindekser. Med disse indeks MongoDB Du vil kunne indeksere data, der har mere komplekse strukturer.

For at opnå et resultat vil vi bruge det, der kaldes punktnotation, hvilket ikke er mere end at få adgang til felterne i de integrerede dokumenter, som om de var egenskaber for et objekt gennem et punkt. I det følgende eksempel opretter vi et indeks over disse egenskaber, lad os først se syntaksen.

Først skal vi indsætte en post med et integreret dokument i vores testdatasæt:

 db.guiamongo.insert ({"name": "Juan", "age": "40", "gender": "Male", "country": "Brazil", "qualifications": {"history": "85 "," litteratur ":" 90 "," kursus ":" 3 "}});
Derefter vil vi lave en simpel forespørgsel i dette tilfælde om kursusegenskaben:
 db.guiamongo.find ({"ratings.course": "3"});
Hvis vi nu vil oprette et indeks, skal vi blot gøre følgende:
 db.guiamongo.ensureIndex ({“grade.course”: 1});
Med dette har vi allerede oprettet et indeks over et dokument, der er integreret i et andet i en samling i MongoDB. Hvis vi ser på dette, er det, vi skulle have opnået i konsollen:

5. Brug forklar ()


Da vi ved, hvordan vi opretter indekser, og vi har en idé om, hvornår og hvorfor vi skal oprette dem, har vi dog endnu ikke set et meget vigtigt værktøj, som giver os mulighed for at vide lidt mere og gå videre i vores forespørgsler; vi henviser til forklare () denne funktion giver os mulighed for at kende klokkeslættet og indekserne, der bruges i forespørgslerne.

Hvad fortæller det os?Returnering af forklare () Det er et dokument, hvor det vil angive markøren, som det bruger til søgningen, så angiver det indeksets grænser, vi har også et felt, der har navnet millis og det vil angive mængden af ​​tid i milli-sekunder, som en forespørgsel tager at udføre, sidstnævnte er meget vigtig, når vi forstår ydeevnen for vores Database.

Lad os se, hvordan vi kan anvende denne funktion til en forespørgsel, vi kommer til at bruge den, vi gjorde i vores tidligere eksempel:

 db.guiamongo.find ({"ratings.course": "3"}). forklar ();
Efter applikationen skal den returnere noget i retning af følgende:

Vi noterer os, hvordan data tilbydes os for at kunne analysere forespørgslen, i cursoren vi ser, at vi har brugt indekset, som vi oprettede i den tidligere øvelse kaldet karakterer.kursus_1, dette hjalp os med at komme dertil 0 milli-sekunder eksekveringstid, hvilket er det optimale tidspunkt for vores forespørgsler, da dette er et testmiljø, vil vi naturligvis ikke have noget ud over det, men hvis vi kan udføre denne øvelse på servere med millioner af poster, vil vi indse kraften i indekser.

Med dette har vi afsluttet denne vejledning, vi har oprettet indeks i vores dokumentsamlinger, og derudover har vi undersøgt nogle værktøjer, der hjælper os med at skaffe vigtige oplysninger til forbedring og frem for alt øge ydeevnen for vores Database.

wave wave wave wave wave