Key Takeaways
- Indexierung in MongoDB kann die Leistung und den Durchsatz erheblich verbessern, indem die Anzahl der vollständigen Dokumente reduziert werden, die gelesen werden müssen, wodurch die Anwendungsleistung verbessert wird.
- mongoDB unterstützt verschiedene Arten von Indexen, einschließlich Standard -_ID -Index, Sekundärindex, Verbindungsindex, Multikey -Index und Multikey -Verbindungsindex. Jeder Typ dient einem bestimmten Zweck und wird für verschiedene Arten von Abfragen verwendet.
- mehr als ein Index kann in einer Sammlung definiert werden, aber eine Abfrage kann nur einen Index während ihrer Ausführung verwenden. Der beste Index wird zur Laufzeit von MongoDBs Query-optimizer ausgewählt.
- Während die Indexierung die Lesevorgänge dramatisch verbessern kann, verursacht es auch seine eigenen Kosten. Die Indexierungsvorgänge belegen Platz und verursachen zusätzlichen Overhead bei jedem Einsatz, Aktualisierung und Löschen von Betrieb auf der Sammlung. Daher profitieren die indizierenden Vorteile von Leseblühen mehr als schreibschreibige Sammlungen.
Die Indexierung ist eines der wichtigsten Konzepte der Arbeit mit MongoDB. Ein ordnungsgemäßes Verständnis ist kritisch, da die Indexierung die Leistung und den Durchsatz dramatisch erhöhen kann, indem die Anzahl der zu gelesenen Dokumente verringert wird, wodurch die Leistung unserer Anwendung erhöht wird. Da Indizes etwas schwer zu verstehen sind, wird diese zweiteilige Serie sie genauer ansehen.
In diesem Artikel werden wir die folgenden fünf Arten von Indizes untersuchen:
- Standard _id Index
- Sekundärindex
- Verbindungsindex
- Multikey Index
- Multikey Compound Index
Es gibt auch einige andere Typen zu diskutieren, aber ich habe sie für Teil 2 logischerweise ein klares Verständnis vermittelt und Verwirrung vermeiden.
Obwohl mehr als ein Index in einer Sammlung definiert werden kann, kann eine Abfrage während ihrer Ausführung nur einen Index verwenden. Die Entscheidung, den besten Index aus den verfügbaren Optionen auszuwählen, wird zur Laufzeit von MongoDBs Query-Optimizer getroffen.
In diesem Artikel geht davon aus, dass Sie ein grundlegendes Verständnis von MongoDB -Konzepten (wie Sammlungen, Dokumenten usw.) haben und grundlegende Abfragen mit PHP (wie Find und Insert) durchführen. Wenn nicht, empfehle ich Ihnen, unsere Anfängerartikel zu lesen: Einführung in MongoDB und MongoDB Revisited.
Für die Serie gehen wir davon aus, dass wir eine Sammlung mit dem Namen mit 500 Dokumenten mit der folgenden Struktur haben:
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
Lassen Sie uns nun verschiedene Arten der Indexierung im Detail untersuchen.
Standard _id Index
Standardmäßig erstellt MongoDB für jede Sammlung einen Standardindex für das Feld _id. Jedes Dokument verfügt über ein eindeutiges Feld als Primärschlüssel, ein 12-Byte-ObjektID. Wenn keine anderen Indizes verfügbar sind, wird dies standardmäßig für alle Arten von Abfragen verwendet.
Öffnen Sie die MongoDB -Shell, um die Indizes für eine Sammlung anzuzeigen, und machen Sie Folgendes:
Die Methode getIndexes () gibt alle Indizes für unsere Sammlung zurück. Wie Sie sehen können, haben wir den Standardindex mit Namen
_id_ . Das Schlüsselfeld gibt an, dass sich der Index im Feld _id befindet und der Wert von 1 eine aufsteigende Reihenfolge anzeigt. Wir werden im nächsten Abschnitt über die Bestellung erfahren.
Sekundärindex
In Fällen, in denen wir in anderen Feldern als _ID -Feld die Indizierung verwenden möchten, müssen wir benutzerdefinierte Indizes definieren. Angenommen, wir möchten nach Posts basierend auf dem Feld user_name suchen. In diesem Fall definieren wir einen benutzerdefinierten Index im Feld user_name der Sammlung. Solche benutzerdefinierten Indizes als der Standardindex werden als sekundäre Indizes bezeichnet.
Um den Effekt der Indexierung auf die Datenbank zu demonstrieren, analysieren wir kurz die Abfrageleistung, ohne zuerst zu indizieren. Dafür werden wir eine Abfrage ausführen, um alle Beiträge mit einem user_name mit "Jim Alexandar" zu finden.
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
Eine wichtige Methode, die häufig mit der Indexierung verwendet wird, ist erklärt (), die Informationen zurückgibt, die für die Indexierung relevant sind. Die Ausgabe der obigen Erklärung () ist wie unten gezeigt:
Einige der wichtigsten Schlüssel, die es wert sind, betrachtet zu werden, sind:
- Cursor - Zeigt den in der Abfrage verwendeten Index an. BasicCursor zeigt an, dass der Standardindex verwendet wurde und MongoDB die gesamte Sammlung durchsuchen musste. Wenn wir die Indexierung anwenden, wird bTreecuror anstelle von BasicCursor .
verwendet
- n - Gibt die Anzahl der Dokumente an, die die Abfrage zurückgegeben hat (in diesem Fall ein Dokument).
- nscannedObjects - Gibt die Anzahl der von der Abfrage durchsuchten Dokumente an (in diesem Fall wurden alle 500 Dokumente der Sammlung durchsucht). Dies kann ein Betrieb mit großem Overhead sein, wenn die Anzahl der in der Sammlung sehr großer Dokumente sehr groß ist.
- nScanned - Zeigt die Anzahl der während des Datenbankvorgangs gescannten Dokumente an.
Im Idealfall sollte N gleich oder in der Nähe von NSCanned sein, was bedeutet, dass eine Mindestanzahl von Dokumenten durchsucht wurde.
Lassen Sie uns nun die gleiche Abfrage ausführen, aber mit einem Sekundärindex. Um den Index zu erstellen, führen Sie Folgendes in der MongoDB -Shell aus:
Wir haben einen Index im Feld user_name erstellt
In der Postsammel mit der Methode für die VersicherungIndex (). Ich bin mir sicher, dass Sie den Wert des Order-Arguments für die Methode, die entweder eine aufsteigende (1) oder absteigende (-1) Reihenfolge für die Suche angibt. Beachten Sie, dass jedes Dokument ein Zeitstempelfeld hat. Wenn wir zuerst die neuesten Beiträge wollen, würden wir absteigender Reihenfolge verwenden. Für die ältesten Beiträge zuerst würden wir aufsteigende Ordnung wählen.
Nach dem Erstellen des Index werden die gleichen Methoden für Find () und Erklärungen () verwendet, um die Abfrage wie zuvor auszuführen und zu analysieren. Die Ausgabe von IS:
Die Ausgabe zeigt, dass die Abfrage einen
bTreecursor mit dem Namen
user_name_1 (das wir zuvor definiert haben) verwendet und nur ein Dokument im Gegensatz zu den 500 Dokumenten, die in der vorherigen Abfrage ohne Indizierung durchsucht wurden, gescannt wurden.
Verstehen Sie vorerst, dass alle MongoDB -Indizes in seinem Algorithmus eine BTree -Datenstruktur verwenden, und BtreeCursor ist der Standardcursor dafür. Eine detaillierte Diskussion von BtreeCursor ist für diesen Artikel nicht mehr auf den Rahmen, dies hat jedoch kein weiteres Verständnis.
Der obige Vergleich zeigt an, wie Indizes die Abfrageleistung drastisch verbessern können.
Verbindungsindex
Es wird Fälle geben, in denen eine Abfrage mehr als ein Feld verwendet. In solchen Fällen können wir zusammengesetzte Indizes verwenden. Betrachten Sie die folgende Abfrage, die sowohl die post_type- als auch post_likes -Felder verwendet:
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
Die Analyse dieser Abfrage mit erklärt () ergibt das folgende Ergebnis, das zeigt, dass die Abfrage BasicCursor verwendet und alle 500 Dokumente gescannt werden, um ein Dokument abzurufen.
Dies ist sehr ineffizient. Wenden wir also einige Indizes an. Wir können einen zusammengesetzten Index auf Feldern post_type und post_likes wie folgt definieren:
Die Analyse der Abfrage gibt nun das folgende Ergebnis an:
Ein sehr wichtiger Punkt hier ist, dass zusammengesetzte Indizes, die auf mehreren Feldern definiert sind, verwendet werden können, um eine Teilmenge dieser Felder abzufragen. Angenommen, es gibt einen zusammengesetzten Index {field1, field2, field3}. Dieser Index kann zum Abfragen verwendet werden:
- field1
- field1, field2
- field1, field2, field3
Wenn wir also den Index {field1, field2, field3} definiert haben, müssen wir separate {field1} und {field1, field2} -Indexes nicht definieren. Wenn wir diesen zusammengesetzten Index beim Abfragen von Field2 und Field2, Field3 benötigen, können wir Hint () verwenden, wenn der Optimierer nicht den gewünschten Index auswählt.
Mit der Hint () -Methode kann MongoDB zur Verwendung eines Index, den wir angeben, den Standardauswahl- und Abfrageoptimierungsprozess erzwingen. Sie können die im Index verwendeten Feldnamen als Argument wie unten gezeigt angeben:
<span><span><?php
</span></span><span><span>// query to find posts with user_name "Jim Alexandar"
</span></span><span><span>$cursor = $collection->find(
</span></span><span> <span>array("user_name" => "Jim Alexandar")
</span></span><span><span>);
</span></span><span><span>// use explain() to get explanation of query indexes
</span></span><span><span>var_dump($cursor->explain());</span></span>
Dadurch wird sichergestellt, dass die Abfrage den auf den Feldern post_type und post_likes definierten zusammengesetzten Index verwendet.
Multikey Index
Wenn die Indexierung in einem Array -Feld durchgeführt wird, wird es als Multikey -Index bezeichnet. Betrachten Sie unser Post -Dokument erneut; Wir können einen Multikey -Index auf post_tags anwenden. Der Multikey -Index würde jedes Element des Arrays indexieren, sodass in diesem Fall separate Indizes für die post_tags -Werte erstellt werden:
mongoDB ,
Tutorial ,
Indexierung und bald.
Indizes auf Array -Feldern müssen jedoch sehr selektiv verwendet werden, da sie aufgrund der Indizierung jedes Werts viel Speicher verbrauchen.
Multikey Compound Index
Wir können einen Multikey -Verbindungsindex erstellen, aber mit der Einschränkung, dass höchstens ein Feld im Index ein Array sein kann. Wenn wir also Feld1 als Zeichenfolge und [Field2, Feld3] als Array haben, können wir den Index {field2, field3} nicht definieren, da beide Felder Arrays sind.
Im folgenden Beispiel erstellen wir einen Index auf den Feldern post_tags und user_name:
Indexierungsbeschränkungen und Überlegungen
Es ist wichtig zu wissen, dass die Indexierung nicht in Abfragen verwendet werden kann, bei denen reguläre Ausdrücke, Negationsoperatoren (d. H. $ ne, $ nicht usw.), arithmetische Operatoren (d. H. $ mod usw.), JavaScript -Ausdrücke in der $ where verwendet werden Klausel und in einigen anderen Fällen.
Die Indexierungsvorgänge haben auch ihre eigenen Kosten. Jeder Index nimmt Platz ein und führt zu einem zusätzlichen Overhead bei jedem Einsatz, Aktualisierung und Löschen von Operationen in der Sammlung. Sie müssen das Les: Schreibverhältnis für jede Sammlung berücksichtigen. Die Indexierung ist vorteilhaft für les-hungrige Sammlungen, ist jedoch möglicherweise nicht für Schreibkollektionen.
MongoDB hält Indizes im RAM. Stellen Sie sicher, dass die Gesamtindexgröße die RAM -Grenze nicht überschreitet. Wenn dies der Fall ist, werden einige Indizes aus dem RAM entfernt und daher verlangsamen Abfragen. Außerdem kann eine Sammlung maximal 64 Indizes haben.
Zusammenfassung
Das ist alles für diesen Teil. Zusammenfassend sind die Indizes für eine Anwendung von großem Nutzen, wenn ein ordnungsgemäßer Indexierungsansatz gewählt wird. Im nächsten Teil werden wir die Verwendung von Indizes für eingebettete Dokumente, Unterdokumente und Bestellungen untersuchen. Bleiben Sie dran!
Bild über Fotolien
häufig gestellte Fragen zur MongoDB -Indexierung
Was ist die Bedeutung der MongoDB -Indexierung in der Datenbankverwaltung? Es verbessert die Leistung von Datenbankoperationen erheblich, indem es einen effizienteren Weg zu den Daten bietet. Ohne Indizes muss MongoDB einen Sammlungsscan durchführen, d. H. SCORKEL in einer Sammlung scannen, um die Dokumente auszuwählen, die der Anweisung für Abfragen übereinstimmen. Mit Indizes kann MongoDB seine Suche auf die relevanten Teile der Daten einschränken und so die Datenmenge verringern, die sie scannen müssen. Dies führt zu schnelleren Abfragemaßzeiten und einer geringeren CPU -Verwendung, was in großen Datenbanken besonders vorteilhaft ist.
Wie funktioniert die MongoDB -Indexierung? Diese Datenstruktur umfasst den Wert eines bestimmten Feldes oder einer Reihe von Feldern, die vom Wert des Feldes geordnet sind, wie im Index angegeben. Wenn eine Abfrage ausgeführt wird, verwendet MongoDB diese Indizes, um die Anzahl der Dokumente zu begrenzen, die sie überprüfen muss. Die Indizes sind besonders vorteilhaft, wenn die Gesamtgröße der Dokumente den verfügbaren RAM überschreitet. Die Leistung Ihrer Fragen. Dazu gehören Einzelfeld-, Verbindungs-, Multikey-, Text-, 2D- und 2dSphere -Indizes. Jeder Indextyp dient einem bestimmten Zweck und wird für verschiedene Arten von Abfragen verwendet. Beispielsweise werden einzelne Feld- und Verbindungsindizes für Abfragen auf einzelnen bzw. mehreren Feldern verwendet. Multikey -Indizes werden für Arrays verwendet, und Textindizes werden für den String -Inhalt verwendet.
Wie erstelle ich einen Index in MongoDB? . Diese Methode erstellt einen Index für ein bestimmtes Feld, wenn der Index noch nicht vorhanden ist. Die Methode nimmt zwei Parameter vor: das Feld oder die Felder zum Index und ein Optionsdokument, mit dem Sie zusätzliche Optionen angeben können.
Kann ich mehrere Indizes in MongoDB erstellen? Indizes in MongoDB. Es ist jedoch wichtig zu beachten, dass Indizes zwar die Abfrageleistung verbessern, aber auch Systemressourcen, insbesondere Speicherplatz und Speicher, konsumieren. Daher ist es entscheidend, Indizes mit Bedacht und nur auf diesen Feldern zu erstellen, die häufig abgefragt werden. MongoDB hängt weitgehend von den Abfragemustern Ihrer Anwendung ab. Felder, die häufig in Sortiervorgängen abfragt oder verwendet werden, sind gute Kandidaten für die Indexierung. Darüber hinaus sind Felder mit einem hohen Grad an Einzigartigkeit auch gute Kandidaten für die Indexierung, da sie die Anzahl der Dokumente, die MongoDB bei der Ausführung einer Abfrage scannen müssen, erheblich reduzieren können.
Sie können überprüfen, ob in MongoDB ein Index mit der Methode getIndexes () vorhanden ist. Diese Methode gibt eine Liste aller Indizes in einer Sammlung zurück, einschließlich des standardmäßigen _id -Index.
Kann ich einen Index in mongoDB? MongoDB unter Verwendung der DropIndex () -Methode. Diese Methode entfernt den angegebenen Index aus einer Sammlung. . Dies kann besonders nützlich sein, wenn kein einzelner Index eine Abfrage erfüllen kann, aber der Schnittpunkt von zwei oder mehr Indizes kann.
Wie wirkt sich die Indexierung auf Schreibvorgänge in MongoDB aus? Dies liegt daran, dass jedes Mal, wenn ein Dokument eingefügt oder aktualisiert wird, alle Indizes der Sammlung auch aktualisiert werden müssen. Je mehr Indizes eine Sammlung hat, desto langsamer wird die Schreibvorgänge sein. Es ist wichtig, beim Erstellen von Indizes ein Gleichgewicht zwischen Leseleistung und Schreibleistung zu finden.
Das obige ist der detaillierte Inhalt vonPHP Master | MongoDB -Indexierung, Teil 1. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!