Werken met indexen in MongoDB

Het is algemeen bekend dat de middelen in productieomgevingen zeer beperkt zijn en dat het waar is dat er nu servers zijn die tien keer krachtiger zijn dan die van 5 jaar geleden, maar naarmate de kracht van deze computers is toegenomen, is ook de vraag van gegevens.

Afhankelijk van de hoeveelheid tijd die een query nodig heeft om uit te voeren, kunnen we zeggen of het kritiek is of niet, maar zelfs als het niet kritiek is, is er altijd een kleine marge voor verbetering. einde van de dag worden omgezet in minuten, wat ons de mogelijkheid geeft om de gebruikerservaring te verbeteren.

VereistenOm deze tutorial uit te voeren hebben we een functionele installatie nodig van: MongoDB met voldoende rechten zodat we in de opdrachtconsole kunnen werken.

We hebben ook een dataset of documenten Om onze verzameling te vullen, hebben we in eerdere tutorials een eerste dataset aangeboden, maar voor degenen die deze niet hebben, kunnen ze deze gebruiken:

 db.guiamongo.insert ({"name": "Maria", "leeftijd": "25", "geslacht": "Vrouwelijk", "land": "Colombia"}); db.guiamongo.insert ({"naam ":" Pedro "," leeftijd ":" 32 "," geslacht ":" Man "," land ":" Ecuador "}); db.guiamongo.insert ({" name ":" Ramon "," leeftijd " : "18", "geslacht": "Man", "land": "Honduras"}); db.guiamongo.insert ({"naam": "John", "leeftijd": "22", "geslacht": "Man", "land": "Argentinië"}); db.guiamongo.insert ({"naam": "Rosa", "leeftijd": "45", "geslacht": "Vrouw", "land": " Chili "," talen ": [" Esp "," Ing "," Fra "]});
Hiermee hebben we genoeg voor een kleine start en halen we dus resultaten uit de oefeningen die we hieronder zullen presenteren.

1. MongoDB indexeren


Indexeren of werken met indexen is een concept dat wordt gedeeld in MongoDB met de Databases relationeel, dat wil zeggen, als we een idee hebben van dit concept, kunnen we begrijpen hoe het werkt in MongoDB al snel moeten we ons gewoon aan de specifieke syntaxis houden.

Werken met indexenAls we onbekenden zijn met het concept, moet worden opgemerkt dat het werken met indices is niets meer dan specificeren aan de Database welke velden u in het geheugen moet gebruiken om uw zoekopdracht efficiënter te maken, bijvoorbeeld als we een grote verzameling documenten opvragen voor een veld met de naam Naam, zou het ideaal zijn om dit veld te indexeren zodat de engine weet dat het direct door dat veld moet worden geleid, waardoor de zoekopdrachten die dat veld gebruiken sneller beginnen te worden.

Een index maken op MongoDB wat we moeten doen is de functie gebruiken verzekerenIndex () en als parameter een document doorgeven JSON met vermelding van de velden of eigenschappen van ons document waarmee we genoemde index moeten conformeren. Laten we hier een klein voorbeeld van bekijken.

Stel dat we een verzameling hebben met de naam guiamongo en we zoeken naar een veld met de naam naam, de code zou dit zijn:

 db.guiamongo.find ({“naam”: “Naam”})
Dit is een normale zoekopdracht die niets in het bijzonder heeft, het enige probleem is dat als er miljoenen documenten zijn, het erg traag zou zijn, dus om een ​​index te maken, hoeven we deze alleen als volgt te specificeren:
 db.guiamongo.ensureIndex ({“naam”: 1})
Hiermee hebben we de index voor de query al gemaakt, als we deze opnieuw uitvoeren zal het veel sneller zijn. Laten we eens kijken hoe dit eruit ziet op onze console MongoDB:

We kunnen opmerken dat zodra we de index hebben gemaakt, MongoDB Het geeft ons een document terug waarin het de status van onze functie aangeeft en hoeveel indexen we voor en na de toepassing hadden, en toont ons bovendien het veld Oke bij 1 wat aangeeft dat de uitvoering is gelukt.

De vorige query is best handig voor een enkel veld, maar als we het volgende doen:

 db.guiamongo.find ({"naam": "Naam", "leeftijd": {"$ gt": "20"}}) sort ({"leeftijd": - 1});
We realiseren ons dat in dit geval de inhoudsopgave De vorige werkt niet meer, dit komt omdat de zoekopdracht een andere combinatie van velden gebruikt voor de zoekopdracht, daarom moeten we een nieuwe index maken met behulp van wat we eerder hebben geleerd, laten we eens kijken hoe het zou zijn:
 db.guiamongo.ensureIndex ("naam": 1, "leeftijd": 1);
Als we nu onze database als volgt controleren, zullen we zien dat we een nieuwe index in de verzameling hebben:

2. Nadeel bij het gebruik van indexen


Ondanks de grote voordelen die het gebruik en het werken met indicesDeze zijn niet altijd gunstig, daarom moeten we grondig analyseren voordat we deze functie in onze database implementeren.

Grootste nadeelDe groot nadeel bij het gebruik van indexen is dat de engine de nieuwe gegevens moet opnemen die we in de tabel of lijst met indexen invoegen, om deze reden elke keer dat een functie wordt gemaakt invoegen () er zullen een aantal aangrenzende processen worden gecreëerd die het schijf- en verwerkingsgebruik kunnen verhogen.

Een ander nadeel is dat we maximaal 64 indexen per collectie, Daarom moeten we met zo min mogelijk van hen in onze database werken, zodat we ervoor zorgen dat alleen het strikt noodzakelijke wordt gebruikt.

3. Hoe weet u wanneer u een index moet gebruiken?


Aangezien we de beperkingen en nadelen van het gebruik van indexen kennen, is een goede oefening om te weten of we ze moeten maken of niet, deze reeks vragen te beantwoorden, als we ze allemaal kunnen beantwoorden, hebben we de nodige kenmerken om een ​​index te maken, op aan de andere kant, als we dat niet kunnen, zullen we de situatie vanuit een ander gezichtspunt moeten analyseren, laten we eens kijken naar de vragen:

Welke vragen doen we?We moeten de situatie analyseren en kijken wat er in onze collectie gebeurt, hiermee zullen we uitzoeken of we indexen nodig hebben, of zo niet, misschien moeten we er enkele verwijderen.

Wat is de juiste oriëntatie van de indices?We moeten weten hoe we de gegevens in de indexen ordenen, of het nu alfabetisch of numeriek is, oplopend of aflopend, dit heeft direct invloed op de snelheid van indexeren.

Hoe zal het schalen?We moeten nadenken over de groei van onze data, omdat we op deze manier weten of wat vandaag werkt, morgen met 10 of 100 keer meer data ook goed zal werken.

Natuurlijk is dit slechts een gids, er zijn speciale en zeer specifieke gevallen van elke applicatiebeheerder waarin u uw criteria moet toepassen op dit soort tutorials, maar het is een goede gids om ons te starten in de wereld van gegevensoptimalisatie .

4. Indexen in ingesloten documenten


De structuur van documenten die we kunnen verwerken in MongoDB leent zich voor complexe gegevensopslag, niet alle gegevens die we nodig hebben zullen op hetzelfde niveau zijn, daarom is de noodzaak om ingesloten documentindexen. Met deze indices MongoDB U kunt gegevens met complexere structuren indexeren.

Om een ​​resultaat te bereiken zullen we gebruik maken van wat de puntnotatie, wat niets meer is dan toegang krijgen tot de velden van de ingesloten documenten alsof het eigenschappen van een object zijn via een punt. In het volgende voorbeeld zullen we een index van deze kenmerken maken, laten we eerst de syntaxis bekijken.

Eerst gaan we een record met een ingesloten document in onze testdataset invoegen:

 db.guiamongo.insert ({"name": "Juan", "leeftijd": "40", "geslacht": "Man", "land": "Brazilië", "kwalificaties": {"geschiedenis": "85 "," literatuur ":" 90 "," cursus ":" 3 "}});
Dan gaan we in dit geval een eenvoudige query doen voor de cursuseigenschap:
 db.guiamongo.find ({“grades.course”: ”3”});
Als we nu een index willen maken, hoeven we alleen maar het volgende te doen:
 db.guiamongo.ensureIndex ({“grades.course”: 1});
Hiermee hebben we al een index gemaakt van een document dat is ingebed in een ander document in een verzameling in MongoDB. Als we naar dit kijken, hadden we dit in de console moeten krijgen:

5. Gebruik uitleggen ()


Omdat we weten hoe we indexen moeten maken en we een idee hebben van wanneer en waarom we ze moeten maken, hebben we echter nog geen tool gezien die erg belangrijk is, een tool waarmee we iets meer kunnen weten en verder kunnen gaan onze vragen; We verwijzen naar leg uit () deze functie stelt ons in staat om de tijd en de indexen te kennen die in de zoekopdrachten worden gebruikt.

Wat vertelt het ons?Terugkomen van leg uit () Het is een document waar het de cursor aangeeft die het gebruikt voor de zoekopdracht, dan geeft het de limieten van de index aan, we hebben ook een veld met de naam millis en het geeft de hoeveelheid tijd in milliseconden aan die een query nodig heeft om uit te voeren, dit laatste is erg belangrijk bij het begrijpen van de prestaties van onze Database.

Laten we eens kijken hoe we deze functie op een query kunnen toepassen, we gaan degene gebruiken die we in ons vorige voorbeeld hebben gedaan:

 db.guiamongo.find ({“grades.course”: ”3”}) uitleggen ();
Na de toepassing zou het zoiets als het volgende moeten retourneren:

We noteren hoe gegevens ons worden aangeboden om de vraag te kunnen analyseren, in cursor we zien dat we de index hebben gebruikt die we in de vorige oefening hebben gemaakt, genaamd grades.course_1, dit heeft ons geholpen om daar te komen 0 milliseconden uitvoeringstijd, wat de optimale tijd is voor onze query's, aangezien dit een testomgeving is, hebben we natuurlijk niets meer dan dat, maar als we deze oefening kunnen doen op servers met miljoenen records, zullen we de kracht van indexen beseffen.

Hiermee hebben we deze tutorial afgerond, we hebben gemaakt indices in onze documentenverzamelingen en daarnaast hebben we enkele hulpmiddelen onderzocht die ons helpen belangrijke informatie te verkrijgen om de prestaties van onze Database.

U zal helpen de ontwikkeling van de site, het delen van de pagina met je vrienden

wave wave wave wave wave