Arbetar med index i MongoDB

Det är välkänt att resurser är mycket begränsade i produktionsmiljöer och att det är sant att det nu finns servrar som är tio gånger mer kraftfulla än de som fanns för 5 år sedan, eftersom kraften hos dessa datorer har ökat, så har också frågan om data.

Beroende på hur lång tid en fråga tar att köra kan vi säga om det är kritiskt eller inte, men även om det inte är kritiskt finns det alltid en liten förbättringsmarginal, med detta sparar vi sekunder av körning som vid slutet av dagen förvandlas till minuter, vilket ger oss möjlighet att förbättra användarupplevelsen.

KravFör att kunna genomföra denna handledning behöver vi en funktionell installation av MongoDB med tillräckliga behörigheter så att vi kan arbeta i kommandokonsolen.

Vi behöver också en datauppsättning eller dokument För att fylla vår samling erbjöd vi i tidigare självstudier en initial datauppsättning, men för dem som inte har det kan de använda detta:

 db.guiamongo.insert ({"name": "Maria", "age": "25", "gender": "Female", "country": "Colombia"}); db.guiamongo.insert ({"name ":" Pedro "," age ":" 32 "," gender ":" Male "," country ":" Ecuador "}); db.guiamongo.insert ({" name ":" Ramon "," age " : "18", "gender": "Man", "country": "Honduras"}); db.guiamongo.insert ({"name": "John", "age": "22", "gender": "Man", "land": "Argentina"}); db.guiamongo.insert ({"name": "Rosa", "age": "45", "gender": "Female", "country": " Chile "," språk ": [" Esp "," Ing "," Fra "]});
Med detta kommer vi att ha tillräckligt för en liten start och därmed få resultat från övningarna som vi kommer att presentera nedan.

1. Indexering av MongoDB


Indexering eller arbete med index är ett koncept som delas i MongoDB med Databaser relationellt, det vill säga om vi har en uppfattning om detta koncept kan vi förstå hur det fungerar MongoDB innan länge måste vi helt enkelt hålla oss till den specifika syntaxen.

Arbetar med indexOm vi ​​är främmande för konceptet, bör det noteras att arbeta med index är inget annat än att specificera för Databas vilka fält du ska använda i minnet för att göra din sökning mer effektiv, till exempel om vi frågar efter en stor samling dokument för ett fält som heter namn, skulle idealet vara att indexera detta fält så att motorn vet att det ska styras direkt av det fältet, genom att göra det börjar frågorna som använder det fältet bli snabbare.

För att skapa ett index på MongoDB vad vi borde göra är att använda funktionen sureIndex () och som parameter skicka ett dokument JSON anger fält eller egenskaper hos vårt dokument som vi måste överensstämma med nämnda index. Låt oss titta på ett litet exempel på detta.

Antag att vi har en samling som heter guiamongo och vi söker efter ett fält som heter namn, koden skulle vara följande:

 db.guiamongo.find ({“name”: “Name”})
Detta är en vanlig fråga som inte har något särskilt, det enda problemet är att om det finns miljontals dokument skulle det vara väldigt långsamt, så för att skapa ett index behöver vi bara ange det enligt följande:
 db.guiamongo.ensureIndex ({“namn”: 1})
Med detta har vi redan skapat index för frågan, om vi kör det igen blir det mycket snabbare. Låt oss se hur det ser ut på vår konsol MongoDB:

Vi kan märka att när vi skapat indexet, MongoDB Det ger oss ett dokument där det anger status för vår funktion och hur många index vi hade före och efter ansökan, och visar oss dessutom fältet Okej vid 1 vilket indikerar att körningen lyckades.

Den föregående frågan är ganska användbar för ett enda fält men om vi gör följande:

 db.guiamongo.find ({"name": "Name", "age": {"$ gt": "20"}}). sort ({"age": - 1});
Vi inser att i detta fall index Den föregående fungerar inte längre, det beror på att frågan använder en annan kombination av fält för sökningen, det är därför vi måste skapa ett nytt index med hjälp av det vi lärt oss tidigare, låt oss se hur det skulle vara:
 db.guiamongo.ensureIndex ("namn": 1, "ålder": 1);
Om vi ​​nu kontrollerar vår databas enligt följande kommer vi att se att vi har ett nytt index i samlingen:

2. Nackdel med användning av index


Trots de stora fördelarna som användningen och arbetet med indexDessa är inte alltid fördelaktiga, det är därför vi måste analysera noggrant innan vi implementerar denna funktion i vår databas.

Största nackdelenDe stor nackdel vid användning av index är att motorn måste införliva de nya data som vi infogar i tabellen eller listan över index, av denna anledning varje gång en funktion görs Föra in () ett antal angränsande processer kommer att skapas som kan öka disk- och bearbetningsanvändningen.

En annan nackdel är att vi har max 64 index per samling, Det är därför vi måste arbeta med minsta möjliga mängd av dem i vår databas, och på så sätt säkerställa att det som är absolut nödvändigt är det som används.

3. Hur man vet när man ska använda ett index


Eftersom vi känner till begränsningarna och nackdelarna med användningen av index, är en bra övning att veta om vi ska skapa dem eller inte att ta denna serie frågor, om vi kan svara på dem alla har vi de nödvändiga egenskaperna för att skapa ett index, på Å andra sidan, om vi inte kan vi måste analysera situationen från en annan synvinkel, låt oss titta på frågorna:

Vilka frågor gör vi?Vi måste göra en analys av situationen och se vad som händer i vår samling, med detta kommer vi att ta reda på om vi behöver index, eller om inte, kanske vi måste eliminera några.

Vad är indexens riktning?Vi måste veta hur vi ordnar data i indexen, om det är alfabetiskt eller numeriskt, stigande eller fallande, påverkar detta direkt hastigheten för indexering.

Hur kommer det att skala?Vi måste tänka på tillväxten av våra data, eftersom vi på så sätt vet om det som fungerar idag i morgon med 10 eller 100 gånger mer data kommer att fungera korrekt.

Naturligtvis är detta bara en guide, det finns speciella och mycket speciella fall för varje applikationsadministratör där du måste tillämpa dina kriterier över denna typ av självstudier, men det är en bra guide för att starta oss i en värld av dataoptimering.

4. Index inom inbäddade dokument


Strukturen av dokument som vi kan hantera i MongoDB lämpar sig för komplex datalagring, inte alla data vi behöver kommer att ligga på samma nivå, det är därför behovet av att skapa inbäddade dokumentindex. Med dessa index MongoDB Du kommer att kunna indexera data som har mer komplexa strukturer.

För att uppnå ett resultat använder vi det som kallas punktnotation, vilket inte är mer än att komma åt fälten i de inbäddade dokumenten som om de vore egenskaper för ett objekt genom en punkt. I följande exempel kommer vi att skapa ett index över dessa egenskaper, låt oss först se syntaxen.

Först ska vi infoga en post med ett inbäddat dokument i vår testdatauppsättning:

 db.guiamongo.insert ({"name": "Juan", "age": "40", "gender": "Male", "country": "Brazil", "qualifications": {"history": "85 "," litteratur ":" 90 "," kurs ":" 3 "}});
Då kommer vi att göra en enkel fråga i detta fall för kursfastigheten:
 db.guiamongo.find ({“grade.course”: ”3”});
Om vi ​​nu vill skapa ett index måste vi helt enkelt göra följande:
 db.guiamongo.ensureIndex ({“grade.course”: 1});
Med detta har vi redan skapat ett index för ett dokument inbäddat i ett annat i en samling i MongoDB. Om vi ​​tittar på detta är vad vi borde ha fått i konsolen:

5. Använd förklara ()


Eftersom vi vet hur vi skapar index och vi har en uppfattning om när och varför vi ska skapa dem, har vi dock ännu inte sett ett verktyg som är mycket viktigt, ett som gör att vi kan veta lite mer och gå längre in våra frågor; vi hänvisar till förklara () Med denna funktion kan vi veta tiden och indexen som används i frågorna.

Vad säger det oss?Återkomsten av förklara () Det är ett dokument där det kommer att markera markören som den använder för sökningen, sedan anger det gränserna för indexet, vi har också ett fält som har namnet millis och det kommer att indikera hur lång tid i millisekunder som en fråga tar att utföra, den senare är mycket viktig när man förstår prestanda för våra Databas.

Låt oss se hur vi kan tillämpa denna funktion på en fråga, vi kommer att använda den vi gjorde i vårt tidigare exempel:

 db.guiamongo.find ({“grade.course”: ”3”}). förklara ();
Efter tillämpningen ska den returnera något liknande följande:

Vi noterar hur data erbjuds oss för att kunna analysera frågan i markören vi ser att vi har använt indexet som vi skapade i föregående övning betyg.kurs_1, detta hjälpte oss att komma dit 0 millisekunder exekveringstid, vilket är den optimala tiden för våra frågor, uppenbarligen eftersom detta är en testmiljö kommer vi inte att ha något utöver det, men om vi kan göra denna övning på servrar med miljontals poster kommer vi att inse kraften i index.

Med detta har vi avslutat den här handledningen, vi har skapat index i våra dokumentsamlingar och dessutom har vi undersökt några verktyg som hjälper oss att få viktig information för att förbättra och framför allt öka prestandan för våra Databas.

wave wave wave wave wave