MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Eine Übersicht über die Datenbankindizierung für MongoDB

Was ist Indizierung?

Indizierung ist ein wichtiges Konzept in der Datenbankwelt. Der Hauptvorteil der Indexerstellung für beliebige Felder ist der schnellere Zugriff auf die Daten. Es optimiert den Prozess der Datenbanksuche und des Zugriffs. Betrachten Sie dieses Beispiel, um dies zu verstehen.

Was wird das DB-System tun, wenn ein Benutzer nach einer bestimmten Zeile aus der Datenbank fragt? Es beginnt mit der ersten Zeile und prüft, ob dies die Zeile ist, die der Benutzer möchte? Wenn ja, geben Sie diese Zeile zurück, andernfalls suchen Sie die Zeile bis zum Ende weiter.

Wenn Sie einen Index für ein bestimmtes Feld definieren, erstellt das DB-System im Allgemeinen eine geordnete Liste der Werte dieses Felds und speichert sie in einer anderen Tabelle. Jeder Eintrag dieser Tabelle zeigt auf die entsprechenden Werte in der ursprünglichen Tabelle. Wenn der Benutzer also versucht, nach einer Zeile zu suchen, sucht er zuerst mithilfe des binären Suchalgorithmus nach dem Wert in der Indextabelle und gibt den entsprechenden Wert aus der ursprünglichen Tabelle zurück. Dieser Vorgang wird weniger Zeit in Anspruch nehmen, da wir die binäre Suche anstelle der linearen Suche verwenden.

In diesem Artikel konzentrieren wir uns auf die MongoDB-Indizierung und verstehen, wie Indizes in MongoDB erstellt und verwendet werden.

Wie erstelle ich einen Index in der MongoDB-Sammlung?

Um einen Index mit der Mongo-Shell zu erstellen, können Sie diese Syntax verwenden:

db.collection.createIndex( <key and index type specification>, <options> )

Beispiel:

So erstellen Sie einen Index für das Namensfeld in der myColl-Sammlung:

db.myColl.createIndex( { name: -1 } )

Typen von MongoDB-Indizes

  1. Standard-_id-Index

    Dies ist der Standardindex, der von MongoDB erstellt wird, wenn Sie eine neue Sammlung erstellen. Wenn Sie für dieses Feld keinen Wert angeben, ist _id standardmäßig der Primärschlüssel für Ihre Sammlung, sodass ein Benutzer nicht zwei Dokumente mit denselben _id-Feldwerten einfügen kann. Sie können diesen Index nicht aus dem Feld _id entfernen.

  2. Einzelfeldindex

    Sie können diesen Indextyp verwenden, wenn Sie einen neuen Index für ein beliebiges Feld außer dem _id-Feld erstellen möchten.

    Beispiel:

    db.myColl.createIndex( { name: 1 } )

    Dadurch wird ein aufsteigender Einzelschlüssel-Index für das Namensfeld in der myColl-Sammlung erstellt

  3. Verbindungsindex

    Sie können auch einen Index für mehrere Felder erstellen, indem Sie zusammengesetzte Indizes verwenden. Für diesen Index ist die Reihenfolge der Felder wichtig, in der sie im Index definiert sind. Betrachten Sie dieses Beispiel:

    db.myColl.createIndex({ name: 1, score: -1 })

    Dieser Index sortiert die Sammlung zuerst nach Namen in aufsteigender Reihenfolge und dann für jeden Namenswert nach Punktzahlwerten in absteigender Reihenfolge.

  4. Multikey-Index

    Dieser Index kann verwendet werden, um Array-Daten zu indizieren. Wenn ein Feld in einer Sammlung ein Array als Wert hat, können Sie diesen Index verwenden, der separate Indexeinträge für jedes Element im Array erstellt. Wenn das indizierte Feld ein Array ist, erstellt MongoDB automatisch einen Multikey-Index darauf.

    Betrachten Sie dieses Beispiel:

    {
    ‘userid’: 1,
    ‘name’: ‘mongo’,
    ‘addr’: [
        {zip: 12345, ...},
    {zip: 34567, ...}
    ]
    }

    Sie können einen Multikey-Index für das Feld addr erstellen, indem Sie diesen Befehl in der Mongo-Shell ausführen.

    db.myColl.createIndex({ addr.zip: 1 })
  5. Georäumlicher Index

    Angenommen, Sie haben einige Koordinaten in der MongoDB-Sammlung gespeichert. Um einen Index für Felder dieses Typs (mit Geodaten) zu erstellen, können Sie einen Geoindex verwenden. MongoDB unterstützt zwei Arten von Geodaten-Indizes.

    • 2D-Index:Sie können diesen Index für Daten verwenden, die als Punkte auf einer 2D-Ebene gespeichert sind.

      db.collection.createIndex( { <location field> : "2d" } )
    • 2dsphere-Index:Verwenden Sie diesen Index, wenn Ihre Daten im GeoJson-Format oder als Koordinatenpaare (Längengrad, Breitengrad) gespeichert sind

    db.collection.createIndex( { <location field> : "2dsphere" } )
  6. Textindex

    Um Abfragen zu unterstützen, die die Suche nach Text in der Sammlung beinhalten, können Sie Text index.

    verwenden

    Beispiel:

    db.myColl.createIndex( { address: "text" } )
  7. gehashter Index

    MongoDB unterstützt Hash-basiertes Sharding. Hash-Index berechnet den Hash der Werte des indizierten Felds. Hashed-Index unterstützt Sharding mit gehashten Sharding-Schlüsseln. Hash-Sharding verwendet diesen Index als Shard-Schlüssel, um die Daten in Ihrem Cluster zu partitionieren.

    Beispiel:

    db.myColl.createIndex( { _id: "hashed" } )
Eigenschaften des Index
  1. Eindeutiger Index

    Diese Eigenschaft stellt sicher, dass das indizierte Feld keine doppelten Werte enthält. Wenn beim Erstellen des Index Duplikate gefunden werden, werden diese Einträge verworfen.

  2. Spärlicher Index

    Diese Eigenschaft stellt sicher, dass alle Abfragen Dokumente mit indiziertem Feld durchsuchen. Wenn ein Dokument kein indiziertes Feld hat, wird es aus der Ergebnismenge verworfen.

  3. TTL-Index

    Dieser Index wird verwendet, um Dokumente nach einem bestimmten Zeitintervall (TTL) automatisch aus einer Sammlung zu löschen. Dies ist ideal zum Entfernen von Dokumenten von Ereignisprotokollen oder Benutzersitzungen.

Leistungsanalyse

Stellen Sie sich eine Sammlung von Schülernoten vor. Es enthält genau 3000000 Dokumente. Wir haben in dieser Sammlung keine Indizes erstellt. Sehen Sie sich dieses Bild unten an, um das Schema zu verstehen.

Beispieldokumente in der Partitursammlung

Betrachten Sie nun diese Abfrage ohne Indizes:

db.scores.find({ student: 585534 }).explain("executionStats")

Die Ausführung dieser Abfrage dauert 1155 ms. Hier ist die Ausgabe. Suchen Sie nach dem Feld „ExecutionTimeMillis“, um das Ergebnis zu erhalten.

Ausführungszeit ohne Indizierung

Lassen Sie uns nun einen Index für das Schülerfeld erstellen. Um den Index zu erstellen, führen Sie diese Abfrage aus.

db.scores.createIndex({ student: 1 })

Jetzt dauert die gleiche Abfrage 0ms.

Ausführungszeit mit Indizierung

Sie können den Unterschied in der Ausführungszeit deutlich sehen. Es ist fast augenblicklich. Das ist die Stärke der Indizierung.

Schlussfolgerung

Eine offensichtliche Erkenntnis ist:Erstellen Sie Indizes. Basierend auf Ihren Abfragen können Sie verschiedene Arten von Indizes für Ihre Sammlungen definieren. Wenn Sie keine Indizes erstellen, scannt jede Abfrage die vollständigen Sammlungen, was viel Zeit in Anspruch nimmt, wodurch Ihre Anwendung sehr langsam wird und viele Ressourcen Ihres Servers beansprucht. Erstellen Sie andererseits auch nicht zu viele Indizes, da das Erstellen unnötiger Indizes zusätzlichen Zeitaufwand für alle Einfügungen, Löschungen und Aktualisierungen verursacht. Wenn Sie eine dieser Operationen für ein indiziertes Feld ausführen, müssen Sie dieselbe Operation auch für den Indexbaum ausführen, was einige Zeit in Anspruch nimmt. Indizes werden im RAM gespeichert, sodass das Erstellen irrelevanter Indizes Ihren RAM-Speicherplatz aufbrauchen und Ihren Server verlangsamen kann.