Best Practices für die Leistung: Indizierung
Willkommen zum dritten Teil unserer Reihe von Blogbeiträgen zu Best Practices für die Leistung von MongoDB.
In dieser Reihe behandeln wir wichtige Überlegungen zur Erzielung von Leistung bei skalieren in einer Reihe wichtiger Dimensionen, darunter:
-
Datenmodellierung und Speicherdimensionierung (die Arbeitsfestlegung)
-
Indizierung, die wir heute behandeln werden
-
Sharding
-
Transaktionen und Lese-/Schreibprobleme
-
Hardware und Betriebssystemkonfiguration
-
Bankaufwärmen
Da beide in den letzten 15 Jahren für verschiedene Datenbankanbieter gearbeitet haben, können wir mit Sicherheit sagen, dass das Versäumnis, den richtigen Index zu definieren, das größte Leistungsproblem ist, mit dem sich technische Supportteams bei Benutzern befassen müssen.
Wir müssen es also richtig machen ... hier sind die Best Practices, die Ihnen helfen.
Index in MongoDB
In jeder Datenbank unterstützt Index die effiziente Ausführung von Abfragen. Ohne sie muss die Datenbank jedes Dokument in einer collection oder Tabelle scannen, um diejenigen auszuwählen, die der Abfrageanweisung entsprechen. Wenn für eine Abfrage ein geeigneter Index vorhanden ist, kann die Datenbank mithilfe des Index die Anzahl der Dokumente begrenzen, die sie überprüfen muss.
MongoDB bietet eine breite Palette an Indextypen und Funktionen mit sprachspezifischen Sortierreihenfolgen, um komplexe Zugriffsmuster auf Ihre Daten zu unterstützen. Der MongoDB- Index kann bei Bedarf erstellt und gelöscht werden, um sich ändernden Anwendungsanforderungen und Abfragemustern gerecht zu werden, und kann für jedes Feld in Ihren Dokumenten deklariert werden, einschließlich der in Arrays verschachtelten Felder.
Sehen wir uns also an, wie Sie den Index in MongoDB optimal nutzen.
Verwenden Sie den zusammengesetzten Index
Zusammengesetzte Index sind Index , die aus mehreren verschiedenen Feldern bestehen. Anstatt beispielsweise einen Index für „Nachname“ und einen anderen für „Vorname“ zu haben, ist es in der Regel am effizientesten, einen Index zu erstellen, der sowohl „Nachname“ als auch „Vorname“ enthält, wenn Sie beide Namen abfragen . Unser zusammengesetzter Index kann weiterhin zum Filtern von Abfragen verwendet werden, die nur den Nachnamen angeben.
Befolgen Sie die ESR-Regel
Bei zusammengesetzten Indizes ist diese Faustregel hilfreich, um die Reihenfolge der Felder im Index festzulegen:
-
Fügen Sie zunächst die Felder hinzu, für die Gleichheitsabfragen ausgeführt werden
-
Die nächsten Index sollten die Sortierreihenfolge der Abfrage widerspiegeln
-
Die letzten Felder stellen den Bereich der Daten dar, auf die zugegriffen werden soll
Verwenden Sie nach Möglichkeit abgedeckte Abfragen
Abgedeckte Abfragen liefern Ergebnisse direkt aus einem Index, ohne dass auf die Quelldokumente zugegriffen werden muss, und sind daher sehr effizient.
Damit eine Abfrage abgedeckt werden kann, müssen alle Felder, die zum Filtern, Sortieren und/oder zur Rückgabe an den Client benötigt werden, in einem Index vorhanden sein. Um festzustellen, ob es sich bei einer Abfrage um eine abgedeckte Abfrage handelt, verwenden Sie die Methode „explain()“. Wenn in der EXPLAIN()-Ausgabe „totalDocsExamined“ als 0 angezeigt wird, zeigt dies, dass die Abfrage durch einen Index abgedeckt ist. Weitere Informationen zur Erläuterung der Ergebnisse finden Sie in der Dokumentation.
Ein häufiges Problem beim Versuch, abgedeckte Abfragen zu erreichen, besteht darin, dass das ID Feld immer standardmäßig zurückgegeben wird. Sie müssen es explizit aus den Abfrageergebnissen ausschließen oder dem Index hinzufügen.
Im sharded cluster muss MongoDB intern auf die Felder des shard key zugreifen. Dies bedeutet, dass abgedeckte Abfragen nur möglich sind, wenn der shard key Teil des Index ist. Normalerweise ist es trotzdem eine gute Idee, dies zu tun.
Seien Sie vorsichtig, wenn Sie Index für Felder mit niedriger Kardinalität in Betracht ziehen
Abfragen auf Felder mit einer kleinen Anzahl eindeutiger Werte (geringe Kardinalität) können große Ergebnisse zurückgeben. Der zusammengesetzte Index kann Felder mit niedriger Kardinalität enthalten, der Wert der kombinierten Felder sollte jedoch eine hohe Kardinalität aufweisen.
Eliminieren Sie unnötige Index
Index sind ressourcenintensiv: Selbst bei Komprimierung in der MongoDB WiredTiger Storage Engine verbrauchen sie RAM und Festplatte. Während Felder aktualisiert werden, muss der zugehörige Index beibehalten werden, was zusätzlichen CPU- und Festplatten-E/A-Overhead verursacht.
MongoDB bietet Tools, die Ihnen helfen, die Indexnutzung zu verstehen, auf die wir später in diesem Beitrag eingehen werden.
Platzhalterindizes sind kein Ersatz für die arbeitslastbasierte Indexplanung
Für Arbeitslasten mit vielen Ad-hoc-Abfragemustern oder die stark polymorphe Dokumentstrukturen bewältigen, bietet Ihnen der Wildcard Index viel zusätzliche Flexibilität. Sie können einen Filter definieren, der automatisch alle übereinstimmenden Felder, Unterdokumente und Arrays in einer collection Index.
Wie jeder Index müssen auch sie gespeichert und verwaltet werden, sodass sie der Datenbank Overhead verleihen. Wenn die Abfragemuster Ihrer Anwendung im Voraus bekannt sind, sollten Sie einen selektiveren Index für die spezifischen Felder verwenden, auf die die Abfragen zugreifen.
Verwenden Sie die Textsuche, um Wörter in einem Feld zu finden
Reguläre Index sind nützlich, um den gesamten Wert eines Felds abzugleichen. Wenn Sie nur ein bestimmtes Wort in einem Feld mit viel Text finden möchten, verwenden Sie einen Index.
Wenn Sie MongoDB im Atlas-Dienst ausführen, sollten Sie die Verwendung der Atlas Full Text Search in Betracht ziehen, die einen vollständigmanaged Lucene-Index bereitstellt, der in die MongoDB-Datenbank integriert ist. FTS bietet eine höhere Leistung und größere Flexibilität beim Filtern, Einordnen und Sortieren Ihrer Datenbank, um Ihren Benutzern schnell die relevantesten Ergebnisse anzuzeigen.
Verwenden Sie einen partiellen Index
Reduzieren Sie den Größen- und Overhead von Indizes, indem Sie nur Dokumente einschließen, auf die über den Index zugegriffen werden soll. Erstellen Sie beispielsweise einen Index für das Feld „orderID“, der nur Bestelldokumente mit dem orderStatus „In Bearbeitung“ enthält, oder Index nur das Feld „emailAddress“ für Dokumente, sofern es vorhanden ist.
Nutzen Sie den Multi-Key- Index zum Abfragen von Arrays
Wenn Ihre Abfragemuster den Zugriff auf einzelne Array-Elemente erfordern, verwenden Sie einen Index mit mehreren Schlüsseln. MongoDB erstellt für jedes Element im Array einen Indexschlüssel und kann über Arrays erstellt werden, die sowohl Skalarwerte als auch verschachtelte Dokumente enthalten.
Vermeiden Sie reguläre Ausdrücke, die nicht verankert oder verwurzelt sind
Index ist nach Wert sortiert. Führende Platzhalter sind ineffizient und können zu vollständigen Index-Scans führen. Nachfolgende Platzhalter können effizient sein, wenn der Ausdruck genügend führende Zeichen enthält, bei denen die Groß-/Kleinschreibung beachtet werden muss.
Vermeiden Sie reguläre Ausdrücke ohne Berücksichtigung der Groß- und Kleinschreibung
Wenn der einzige Grund für die Verwendung eines regulären Ausdrucks darin besteht, dass die Groß-/Kleinschreibung nicht berücksichtigt wird, verwenden Sie stattdessen einen Index, bei dem die Groß-/Kleinschreibung nicht berücksichtigt wird, da diese schneller sind.
Nutzen Sie die in der WiredTiger Storage Engine verfügbaren Indexoptimierungen
Wenn Sie MongoDB selbst verwalten, können Sie Index optional auf einem eigenen separaten Volume platzieren, was ein schnelleres Festplatten-Paging und weniger Konflikte ermöglicht. Weitere Informationen finden Sie unter WiredTiger -Optionen.
Nutzen Sie den Explain-Plan
Wir haben die Verwendung des Explain-Plans von MongoDB im vorherigen Beitrag zu Abfragemustern und zur Profilerstellung behandelt. Dies ist das beste Tool, um die Indexabdeckung für einzelne Abfragen zu überprüfen.
Basierend auf dem Explain-Plan stellt MongoDB Visualisierungstools bereit, die dabei helfen, das Verständnis Ihres Index weiter zu verbessern, und die intelligente und automatische Empfehlungen dazu liefern, welcher Index hinzugefügt werden sollte.
Visualisieren Sie die Indexabdeckung mit MongoDB Compass und Atlas Data Explorer
Als kostenlose grafische Benutzeroberfläche für MongoDB Compass viele Funktionen, die Ihnen bei der Optimierung der Abfrageleistung helfen, einschließlich der Untersuchung Ihres Schemas und der Visualisierung von Abfrage-Erklärungsplänen – zwei Bereiche, die bereits in dieser Serie behandelt wurden.
Die Registerkarte Index in Compass erweitert Ihr Arsenal um ein weiteres Werkzeug. Es listet die vorhandenen Indizes für eine collection auf und meldet den Namen und die Schlüssel des Index sowie seinen Typ, seine Größe und alle speziellen Eigenschaften. Über die Registerkarte „Index“ können Sie bei Bedarf auch Indizes hinzufügen und löschen.
Eine wirklich nützliche Funktion ist die Indexnutzung, die Ihnen anzeigt, wie oft ein Index verwendet wurde. Zu viele Index können Ihre Leistung fast genauso beeinträchtigen wie zu wenige. Daher ist diese Funktion besonders wertvoll, wenn es darum geht, nicht verwendete Index zu identifizieren und zu entfernen. Dies hilft Ihnen, Arbeitsspeicherplatz freizugeben und eliminiert den Datenbank- Overhead , der durch die Pflege des Index entsteht.
Wenn Sie MongoDB in unserem vollständigmanaged Atlas-Dienst ausführen, bietet Ihnen die Indexansicht im Daten-Explorer die gleiche Funktionalität wie Compass, ohne dass Sie mit einem separaten Tool eine Verbindung zu Ihrer Datenbank herstellen müssen.
Sie können Indexstatistiken auch mithilfe der aggregation pipeline $indexStats abrufen.
Automatisierte Indexempfehlungen
Trotz der gesamten Telemetrie, die von den MongoDB-Tools bereitgestellt wird, sind Sie immer noch dafür verantwortlich, die erforderlichen Daten abzurufen und zu analysieren, um Entscheidungen darüber zu treffen, welcher Index hinzugefügt werden soll.
Der Schwellenwert für langsame Abfragen variiert je nach der durchschnittlichen Betriebszeit Ihres cluster , um Empfehlungen bereitzustellen, die für Ihre Arbeitslast relevant sind.
Empfohlene Indizes werden von Beispielabfragen begleitet, die nach Abfrageform gruppiert sind (d. h. Abfragen mit ähnlicher Prädikatstruktur, Sortierung und Projektion), die für eine collection ausgeführt wurden, die von der Hinzufügung eines vorgeschlagenen Index profitieren würde. Der Performance Advisor hat keinen negativen Einfluss auf die Leistung Ihres Atlas cluster.
Wenn Sie mit der Empfehlung zufrieden sind, können Sie den neuen Index automatisch einführen, ohne dass es zu Ausfallzeiten der Anwendung kommt.
Was kommt als nächstes
Damit ist diese neueste Ausgabe der Best-Practices-Serie zur Leistung abgeschlossen. Die MongoDB University bietet einen kostenlosen, webbasierten Schulungskurs zur MongoDB-Leistung an. Dies ist eine großartige Möglichkeit, mehr über die Leistungsfähigkeit der Indizierung zu erfahren.