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

Grundlegendes zu MongoDB-Indizes

Zu den Aufgaben des Datenbankmanagements gehört es, die Leistung durch verschiedene Strategien zu verbessern. Die Indizierung ist einer der Tipps, die den Durchsatz verbessern, indem sie den Datenzugriff auf Abfrageanforderungen erleichtern. Dies wird erreicht, indem die Anzahl der Plattenzugriffe minimiert wird, die erforderlich sind, wenn eine Abfrage verarbeitet wird. Wenn keine Indizes in MongoDB verwendet werden, wird die Datenbank gezwungen, einen vollständigen Sammlungsscan durchzuführen, d. h. alle Dokumente in der Sammlung zu durchsuchen, um Dokumente auszuwählen, die mit einer ausgegebenen Abfrageanweisung übereinstimmen. Dies wird natürlich viel Zeit in Anspruch nehmen, besonders wenn es um so viele Dokumente geht. Kurz gesagt, Indizes unterstützen die effiziente Ausführung von Abfragen.

MongoDB-Indizes

Da wir davon ausgehen, viele Dokumente in einer MongoDB-Sammlung zu speichern, müssen wir einen Weg finden, einen kleinen Teil der Daten für jedes Dokument in einer anderen Partition zu speichern, um das Durchlaufen mithilfe von Indizes zu erleichtern. Ein Index speichert einen bestimmten Feldwert oder bestimmte Felder und sortiert diese Daten dann in der Reihenfolge des Werts dieses Felds. Mit dieser Reihenfolge werden ein effizienter Abfrageabgleich und bereichsbasierte Abfrageoperationen unterstützt. Indizes werden auf Sammlungsebene definiert und von jedem Feld oder eingebetteten Feld der Dokumente in der Sammlung unterstützt.

Wenn Sie ein Dokument erstellen, weist MongoDB standardmäßig ein _id-Feld zu, wenn es nicht angegeben ist, und macht dies zu einem eindeutigen Index für dieses Dokument. Im Grunde soll dies verhindern, dass dasselbe Dokument mehr als eines in diese Sammlung eingefügt wird. Darüber hinaus ist es für einen Sharding-Cluster ratsam, dieses _id-Feld als Teil der Shard-Schlüsselauswahl zu verwenden, andernfalls müssen die Daten im _id-Feld eindeutig sein, um Fehler zu vermeiden.

Erstellen eines Index für eine Sammlung

Angenommen, Sie haben einige Daten in Ihre Sammlung eingefügt und möchten einem Feld einen Index zuweisen, können Sie dies mit der createIndex-Methode erreichen, z. B.

Angenommen, Sie haben diese JSON-Daten:

{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

Wir können das Name-Feld zu einem absteigenden Index machen, indem wir:

db.collection.createIndex({Name: -1})

Diese Methode erstellt einen Index mit der gleichen Spezifikation, falls er noch nicht existiert.

Indextypen in MongoDB

MongoDB umfasst verschiedene Datentypen, daher werden verschiedene Arten von Indizes abgeleitet, um diese Datentypen und Abfragen zu unterstützen.

  1. Einzelfeld

    Wenn Sie ein einzelnes Feld eines Dokuments verwenden, können Sie das Feld wie im obigen Beispiel aufsteigend oder absteigend zu einem Index machen. Außerdem können Sie einen Index für ein eingebettetes Dokument als Ganzes erstellen, zum Beispiel:

    { 
        _id: “xyz”,
        Contact:{
            email: “[email protected]”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    Das Kontaktfeld ist ein eingebettetes Dokument, daher können wir es mit dem Befehl zu einem aufsteigenden Index machen:

    db.collection.createIndex({ Contact: 1})

    In einer Abfrage können wir das Dokument wie folgt abrufen:

    db.collection.find({ 
        Contact: {email: “[email protected]”,
        phone:”+420 78342823”} 
    })

    Eine bewährte Methode ist das Erstellen des Indexes im Hintergrund, insbesondere wenn es sich um eine große Datenmenge handelt, da die Anwendung beim Erstellen des Indexes auf die Daten zugreifen muss.

  2. Verbindungsindex

    Zusammengesetzte Indizes werden häufig verwendet, um den Sortiervorgang innerhalb einer Abfrage zu erleichtern und Abfragen zu unterstützen, die in mehreren Feldern übereinstimmen. Die Syntax zum Erstellen eines zusammengesetzten Indexes lautet:

    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    Erstellen eines zusammengesetzten Indexes für die Beispieldaten unten

    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    Überlegungen:

    • Ein Limit von nur 32 Feldern kann unterstützt werden.
    • Der Wert des Feldes definiert den Indextyp, d. h. 1 ist aufsteigend und -1 ist absteigend.
    • Erstellen Sie keine zusammengesetzten Indizes mit gehashtem Indextyp.
    • Die Reihenfolge der in einem zusammengesetzten Index aufgelisteten Felder ist wichtig. Die Sortierung erfolgt nach der Reihenfolge der Felder.
  3. Multikey-Index

    Irgendwann haben Sie möglicherweise Felder mit gespeicherten Array-Inhalten. Wenn diese Felder indiziert werden, werden separate Indexeinträge für jedes Element erstellt. Es hilft daher bei einer Abfrage, Dokumente auszuwählen, die aus Arrays bestehen, indem ein Element oder Elemente der Arrays abgeglichen werden. Dies wird automatisch von MongoDB durchgeführt, daher muss der Multikey-Typ nicht explizit angegeben werden. Ab Version 3.4 verfolgt MongoDB, welche indizierten Felder dazu führen, dass ein Index ein Multikey-Index ist. Mit diesem Tracking darf die Datenbankabfrage-Engine engere Indexgrenzen verwenden.

    Einschränkungen des Multikey-Index

    • Nur ein Array-Feld kann bei der Multikey-Indizierung für ein Dokument in der Sammlung verwendet werden. D.h. Sie können keinen Multikey-Index für den Befehl und die Daten unter
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      Sie können keinen Multikey-Index
      { nums: 1, scores: 1 } 
    • Wenn der Multikey-Index bereits existiert, können Sie kein Dokument einfügen, das gegen diese Einschränkung verstößt. Das heißt, wenn wir
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      Nach dem Erstellen eines zusammengesetzten Multikey-Index schlägt ein Versuch, ein Dokument einzufügen, in dem sowohl Zahlen- als auch Scores-Felder Arrays sind, durch die Datenbank beim Einfügen fehl.
  4. Textindizes

    Textindizes werden häufig verwendet, um Suchabfragen für eine Zeichenfolge in einer Sammlung zu verbessern. Sie speichern keine sprachspezifischen Stoppwörter (z. B. „the“, „a“, „or“). Eine Sammlung kann höchstens einen Textindex haben. So erstellen Sie einen Textindex:

    db.collection.createIndex({Name:”text”})

    Sie können auch mehrere Felder indizieren, z. B.

    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    Ein zusammengesetzter Index kann einen Textindexschlüssel in Kombination mit dem aufsteigenden/absteigenden Indexschlüssel enthalten, aber:

    • Alle Textindexschlüssel müssen im Indexspezifikationsdokument nebeneinander stehen, wenn ein zusammengesetzter Textindex erstellt wird.
    • Keine anderen speziellen Indextypen wie Multikey-Indexfelder sollten in den zusammengesetzten Textindex einbezogen werden.
    • Um eine $text-Suche durchzuführen, muss das Abfrageprädikat Gleichheitsübereinstimmungsbedingungen für die vorhergehenden Schlüssel enthalten.
  5. Hash-Indizes

    Sharding ist eine der Techniken, die in MongoDB verwendet werden, um die horizontale Skalierung zu verbessern. Das Sharding beinhaltet häufig ein Hash-basiertes Konzept durch die Verwendung von Hash-Indizes. Die zufälligere Verteilung von Werten entlang ihres Bereichs wird durch diese Indizes dargestellt, sie unterstützen jedoch nur Gleichheitsübereinstimmungen und keine bereichsbasierten Abfragen.

Gesamtüberlegungen zum Betrieb von Indizes

  • Jeder Index benötigt mindestens 8 KB Speicherplatz.
  • Wenn aktiv, verbraucht jeder Index etwas Speicherplatz und Arbeitsspeicher. Dies ist wichtig, wenn es in der Kapazitätsplanung nachverfolgt wird.
  • Für eine Sammlung mit hohem Lese-zu-Schreib-Verhältnis verbessern zusätzliche Indizes die Leistung und wirken sich nicht auf nicht indizierte Lesevorgänge aus.

Einschränkungen bei der Verwendung von Indizes

  • Das Hinzufügen eines Index hat einige negative Auswirkungen auf die Leistung von Schreibvorgängen, insbesondere für Sammlungen mit einem hohen Schreib-zu-Lese-Verhältnis. Indizes sind insofern teuer, als jede Einfügung auch jeden Index aktualisieren muss.
  • MongoDB wird keinen Index erstellen, aktualisieren oder in eine indizierte Sammlung einfügen, wenn der Indexeintrag für ein vorhandenes Dokument das Indexschlüssellimit überschreitet.
  • Bei bestehenden fragmentierten Sammlungen schlägt die Chunk-Migration fehl, wenn der Chunk ein Dokument enthält, das ein indiziertes Feld mit einem Indexeintrag enthält, der das Indexschlüssellimit überschreitet.

Schlussfolgerung

Es gibt so viele Möglichkeiten, die Leistung von MongoDB zu verbessern, und die Indizierung ist eine davon. Die Indizierung vereinfacht Abfragevorgänge, indem sie die Latenz verringert, während der Daten abgerufen werden, indem die Anzahl der zu scannenden Dokumente irgendwie minimiert wird. Es gibt jedoch einige Überlegungen, die man anstellen muss, bevor man sich für die Verwendung eines bestimmten Indextyps entscheidet. Sammlungen mit einem hohen Lese-zu-Schreib-Verhältnis neigen dazu, Indizes besser zu nutzen als Sammlungen mit vielen Schreib-zu-Lese-Vorgängen.