Es ist bekannt, dass die Ressourcen in Produktionsumgebungen sehr begrenzt sind und dass es heute Server gibt, die zehnmal leistungsfähiger sind als die vor 5 Jahren Daten.
Abhängig von der Zeit, die für die Ausführung einer Abfrage benötigt wird, können wir sagen, ob sie kritisch ist oder nicht, aber auch wenn sie nicht kritisch ist, gibt es immer einen kleinen Spielraum für Verbesserungen Ende des Tages werden in Minuten umgewandelt, was uns die Möglichkeit gibt, die Benutzererfahrung zu verbessern.
AnforderungenUm dieses Tutorial durchführen zu können, benötigen wir eine funktionsfähige Installation von MongoDB mit ausreichenden Berechtigungen, damit wir in der Befehlskonsole arbeiten können.
Wir brauchen auch a Datensatz oder Dokumente Um unsere Sammlung zu füllen, haben wir in früheren Tutorials einen ersten Datensatz angeboten, aber für diejenigen, die ihn nicht haben, können sie diesen verwenden:
db.guiamongo.insert ({"Name": "Maria", "Alter": "25", "Geschlecht": "Weiblich", "Land": "Kolumbien"}); db.guiamongo.insert ({"Name ":" Pedro "," Alter ":" 32 "," Geschlecht ":" Männlich "," Land ":" Ecuador "}); db.guiamongo.insert ({" name ":" Ramon "," alter " : "18", "gender": "Male", "country": "Honduras"}); db.guiamongo.insert ({"name": "John", "age": "22", "gender": "Männlich", "Land": "Argentinien"}); db.guiamongo.insert ({"Name": "Rosa", "Alter": "45", "Geschlecht": "Weiblich", "Land": " Chile "," Sprachen": [" Esp "," Ing "," Fra "]});Damit haben wir genug für einen kleinen Start und erhalten so Ergebnisse aus den Übungen, die wir im Folgenden vorstellen.
1. Indizierung von MongoDB
Indizieren oder Arbeiten mit Indizes ist ein Konzept, das in . geteilt wird MongoDB mit dem Datenbanken relational, das heißt, wenn wir eine Vorstellung von diesem Konzept haben, können wir verstehen, wie es funktioniert MongoDB in Kürze müssen wir uns nur noch an die jeweilige Syntax halten.
Mit Indizes arbeitenWenn uns das Konzept fremd ist, ist zu beachten, dass die Arbeit mit Indizes ist nichts anderes als die Angabe der Datenbank welche Felder Sie im Speicher verwenden sollten, um Ihre Suche effizienter zu gestalten, zum Beispiel wenn wir eine große Sammlung von Dokumenten nach einem Feld namens . abfragen Name, wäre es ideal, dieses Feld zu indizieren, damit die Engine weiß, dass sie direkt von diesem Feld geleitet werden sollte. Dadurch werden die Abfragen, die dieses Feld verwenden, schneller.
So erstellen Sie einen Index auf MongoDB Was wir tun sollten, ist die Funktion zu verwenden sicherstellenIndex () und als Parameter ein Dokument übergeben JSON Angabe der Felder oder Eigenschaften unseres Dokuments, mit denen wir diesen Index übereinstimmen müssen. Schauen wir uns dazu ein kleines Beispiel an.
Angenommen, wir haben eine Sammlung namens Guiamongo und wir suchen nach einem Feld namens name, der Code wäre dieser:
db.guiamongo.find ({"Name": "Name"})Dies ist eine normale Abfrage, die nichts Besonderes hat. Das einzige Problem besteht darin, dass sie bei Millionen von Dokumenten sehr langsam wäre. Um einen Index zu erstellen, müssen wir ihn also nur wie folgt angeben:
db.guiamongo.ensureIndex ({“Name”: 1})Damit haben wir bereits den Index für die Abfrage erstellt, wenn wir ihn erneut ausführen, geht es viel schneller. Mal sehen, wie das auf unserer Konsole aussieht MongoDB:
Wir können feststellen, dass, sobald wir den Index erstellt haben, MongoDB Es gibt uns ein Dokument zurück, in dem es den Status unserer Funktion anzeigt und wie viele Indizes wir vor und nach der Anwendung hatten, und zeigt uns zusätzlich das Feld an Okay auf 1, was anzeigt, dass die Ausführung erfolgreich war.
Die vorherige Abfrage ist für ein einzelnes Feld sehr nützlich, aber wenn wir Folgendes tun:
db.guiamongo.find ({"name": "Name", "age": {"$ gt": "20"}}).sort ({"age": - 1});Wir wissen, dass in diesem Fall die Index Der vorherige funktioniert nicht mehr, weil die Abfrage eine andere Kombination von Feldern für die Suche verwendet, deshalb müssen wir einen neuen Index mit dem, was wir zuvor gelernt haben, erstellen, mal sehen, wie es wäre:
db.guiamongo.ensureIndex ("Name": 1, "Alter": 1);Wenn wir nun unsere Datenbank wie folgt überprüfen, sehen wir, dass wir einen neuen Index in der Sammlung haben:
2. Nachteil bei der Verwendung von Indizes
Trotz der großen Vorteile, die der Einsatz und das Arbeiten mit IndizesDiese sind nicht immer von Vorteil, deshalb müssen wir diese Funktion gründlich analysieren, bevor wir diese Funktion in unserer Datenbank implementieren.
Größter NachteilDas großer Nachteil bei der Verwendung von Indizes ist, dass die Engine die neuen Daten aufnehmen muss, die wir in die Tabelle oder Liste der Indizes einfügen, aus diesem Grund jedes Mal, wenn eine Funktion erstellt wird Einfügung () Es werden mehrere benachbarte Prozesse erstellt, die die Festplatten- und Verarbeitungsnutzung erhöhen können.
Ein weiterer Nachteil ist, dass wir maximal 64 Indizes pro Sammlung, Deshalb müssen wir in unserer Datenbank mit möglichst wenig davon arbeiten, um sicherzustellen, dass nur das Nötigste verwendet wird.
3. Wie man weiß, wann man einen Index verwendet
Da wir die Einschränkungen und Nachteile der Verwendung von Indizes kennen, ist eine gute Übung, um zu wissen, ob wir sie erstellen sollten oder nicht, diese Reihe von Fragen zu beantworten. Wenn wir sie alle beantworten können, haben wir die notwendigen Eigenschaften, um einen Index zu erstellen Andererseits, wenn wir dies nicht können, müssen wir die Situation aus einem anderen Blickwinkel analysieren, schauen wir uns die Fragen an:
Welche Abfragen machen wir?Wir müssen eine Analyse der Situation durchführen und sehen, was in unserer Sammlung passiert, damit wir herausfinden, ob wir Indizes brauchen, oder wenn nicht, müssen wir vielleicht welche eliminieren.
Wie ist die richtige Ausrichtung der Indizes?Wir müssen wissen, wie wir die Daten in den Indizes anordnen, ob alphabetisch oder numerisch, auf- oder absteigend, dies beeinflusst direkt die Geschwindigkeit für die Indizierung.
Wie wird es skalieren?Wir müssen über das Wachstum unserer Daten nachdenken, denn auf diese Weise wissen wir, ob das, was heute mit 10 oder 100 Mal mehr Daten funktioniert, morgen richtig funktioniert.
Natürlich ist dies nur ein Leitfaden, es gibt spezielle und sehr spezielle Fälle jedes Anwendungsadministrators, in denen Sie Ihre Kriterien bei dieser Art von Tutorials anwenden müssen, aber es ist ein guter Leitfaden, um uns in die Welt der Datenoptimierung zu starten.
4. Indizes in eingebetteten Dokumenten
Die Struktur der Dokumente, die wir verarbeiten können MongoDB eignet sich für die komplexe Datenspeicherung, nicht alle Daten, die wir benötigen, werden auf dem gleichen Niveau sein, deshalb ist die Notwendigkeit zu erstellen eingebettete Dokumentindizes. Mit diesen Indizes MongoDB Sie können Daten mit komplexeren Strukturen indizieren.
Um ein Ergebnis zu erzielen, verwenden wir das sogenannte Punktnotation, was nichts anderes ist, als durch einen Punkt auf die Felder der eingebetteten Dokumente zuzugreifen, als wären sie Eigenschaften eines Objekts. Im folgenden Beispiel erstellen wir einen Index dieser Merkmale, sehen wir uns zunächst die Syntax an.
Zuerst fügen wir einen Datensatz mit einem eingebetteten Dokument in unseren Testdatensatz ein:
db.guiamongo.insert ({"Name": "Juan", "Alter": "40", "Geschlecht": "Männlich", "Land": "Brasilien", "Qualifikationen": {"Geschichte": "85 "," Literatur ":" 90 "," Kurs ":" 3"}});Dann werden wir in diesem Fall eine einfache Abfrage für die Kurseigenschaft durchführen:
db.guiamongo.find ({“noten.kurs”: ”3”});Wenn wir nun einen Index erstellen möchten, müssen wir einfach Folgendes tun:
db.guiamongo.ensureIndex ({“noten.kurs”: 1});Damit haben wir bereits einen Index eines in ein anderes eingebetteten Dokuments in einer Sammlung in . erstellt MongoDB. Wenn wir uns das ansehen, hätten wir in der Konsole erhalten:
5. Verwenden Sie erklären ()
Da wir wissen, wie man Indizes erstellt und wir eine Vorstellung davon haben, wann und warum wir sie erstellen sollten, haben wir jedoch noch kein sehr wichtiges Werkzeug gesehen, das es uns ermöglicht, ein wenig mehr zu wissen und weiter zu gehen unsere Anfragen; wir verweisen auf erklären () Diese Funktion ermöglicht es uns, die Zeit und die in den Abfragen verwendeten Indizes zu kennen.
Was sagt es uns?Rückkehr von erklären () Es ist ein Dokument, in dem der Cursor angezeigt wird, der für die Suche verwendet wird, dann die Grenzen des Indexes, wir haben auch ein Feld mit dem Namen Millise und es gibt die Zeit in Millisekunden an, die eine Abfrage benötigt, um ausgeführt zu werden. Letzteres ist sehr wichtig, um die Leistung unserer . zu verstehen Datenbank.
Sehen wir uns an, wie wir diese Funktion auf eine Abfrage anwenden können. Wir verwenden die in unserem vorherigen Beispiel:
db.guiamongo.find ({“noten.kurs”: ”3”}).erklären ();Nach seiner Anwendung sollte es etwa Folgendes zurückgeben:
Wir nehmen zur Kenntnis, wie uns Daten angeboten werden, um die Anfrage analysieren zu können, in Mauszeiger Wir sehen, dass wir den Index verwendet haben, den wir in der vorherigen Übung namens . erstellt haben noten.kurs_1, das hat uns geholfen, dorthin zu gelangen 0 Millisekunden Ausführungszeit, die die optimale Zeit für unsere Abfragen ist. Da dies eine Testumgebung ist, werden wir natürlich nichts darüber hinaus haben, aber wenn wir diese Übung auf Servern mit Millionen von Datensätzen durchführen können, werden wir die Leistungsfähigkeit von Indizes erkennen.
Damit haben wir dieses Tutorial abgeschlossen, das wir erstellt haben Indizes in unseren Dokumentensammlungen und zusätzlich haben wir einige Tools erforscht, die uns helfen, wichtige Informationen zu erhalten, um die Leistung unserer Datenbank.