MongoDB Indizes erstellen

MongoDBBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie die grundlegenden Techniken zum Erstellen und Verwalten von Indizes in MongoDB. Indizes sind entscheidend für die Optimierung der Datenbankleistung, da sie es der Datenbank ermöglichen, Daten viel schneller zu finden und abzurufen, als wenn jedes Dokument in einer Collection gescannt werden müsste. Sie werden das Erstellen von Einzel-, Verbund- und eindeutigen Indizes üben, deren Auswirkungen auf die Abfrageleistung analysieren und deren Lebenszyklus verwalten. Am Ende dieses Labs werden Sie ein solides Verständnis dafür haben, wie Sie Indizes nutzen können, um Ihre MongoDB-Abfragen effizienter zu gestalten.

Einen Single-Field-Index erstellen

In diesem ersten Schritt verbinden Sie sich mit MongoDB, erstellen eine Datenbank mit einer Beispielsammlung und erstellen dann Ihren ersten Index auf einem einzelnen Feld. Ein Einzel-Feld-Index verbessert die Leistung von Abfragen, die auf diesem spezifischen Feld filtern oder sortieren.

Öffnen Sie zunächst die MongoDB Shell, indem Sie mongosh in Ihrem Terminal eingeben. Dies verbindet Sie mit dem MongoDB-Server, der in Ihrer Umgebung läuft.

mongosh

Sobald Sie sich in der MongoDB Shell befinden, sehen Sie eine > Eingabeaufforderung. Lassen Sie uns eine neue Datenbank namens indexlab erstellen und zu ihr wechseln. Alle nachfolgenden Befehle in diesem Lab werden innerhalb dieser Shell ausgeführt, sofern nicht anders angegeben.

use indexlab

Nun fügen wir einige Beispieldokumente in eine neue Collection namens users ein. Diese Daten werden im gesamten Lab verwendet.

db.users.insertMany([
  { name: "Alice", age: 28, email: "alice@example.com" },
  { name: "Bob", age: 35, email: "bob@example.com" },
  { name: "Charlie", age: 42, email: "charlie@example.com" }
]);

Nachdem unsere Daten vorhanden sind, erstellen wir einen Index auf dem Feld name. Ein Index auf einem einzelnen Feld hilft, Abfragen zu beschleunigen, die nach diesem Feld suchen.

db.users.createIndex({ name: 1 });

Im obigen Befehl gibt { name: 1 } an, dass der Index auf dem Feld name in aufsteigender Reihenfolge erstellt werden soll. Die Verwendung von -1 würde einen absteigenden Index erstellen.

Um zu überprüfen, ob der Index erstellt wurde, können Sie alle Indizes für die Collection users auflisten.

db.users.getIndexes();

Sie sollten zwei Indizes in der Ausgabe sehen. Einer ist der Standard-_id-Index, der von MongoDB für jede Collection erstellt wird, und der andere ist der name_1-Index, den Sie gerade erstellt haben.

[
  { "v": 2, "key": { "_id": 1 }, "name": "_id_" },
  { "v": 2, "key": { "name": 1 }, "name": "name_1" }
]

Einen Compound-Index erstellen

Während Einzel-Feld-Indizes nützlich sind, filtern viele Abfragen nach mehreren Feldern. Für diese Fälle kann ein Verbund-Index, der mehrere Felder umfasst, einen erheblichen Leistungsschub bieten. In diesem Schritt erstellen Sie einen Verbund-Index.

Fahren wir in der mongosh-Shell fort. Wir erstellen einen Verbund-Index auf den Feldern age und name. Die Reihenfolge der Felder in einem Verbund-Index ist wichtig. MongoDB kann diesen Index verwenden, um Abfragen nur nach age oder nach age und dann name zu unterstützen.

db.users.createIndex({ age: -1, name: 1 });

Dieser Befehl erstellt einen Index, der Dokumente zuerst nach age in absteigender Reihenfolge (-1) sortiert und dann für Dokumente mit demselben Alter nach name in aufsteigender Reihenfolge (1) sortiert.

Fügen wir einige weitere Dokumente hinzu, um unsere Collection für Abfragen vielfältiger zu gestalten.

db.users.insertMany([
  { name: "David", age: 28, email: "david@example.com" },
  { name: "Eve", age: 35, email: "eve@example.com" }
]);

Zeigen Sie nun erneut die Liste der Indizes an, um Ihren neuen Verbund-Index zu sehen.

db.users.getIndexes();

Die Ausgabe enthält nun zusätzlich zu den vorherigen den Index age_-1_name_1.

[
  { "v": 2, "key": { "_id": 1 }, "name": "_id_" },
  { "v": 2, "key": { "name": 1 }, "name": "name_1" },
  { "v": 2, "key": { "age": -1, "name": 1 }, "name": "age_-1_name_1" }
]

Dieser Verbund-Index bedient effizient Abfragen, die nach age oder nach age und dann name filtern oder sortieren.

Einen Unique-Index erstellen

Indizes können auch zur Durchsetzung der Datenintegrität verwendet werden. Ein Unique-Index stellt sicher, dass das indizierte Feld (oder die Felder) keine doppelten Werte enthält. In diesem Schritt erstellen Sie einen Unique-Index, um doppelte E-Mail-Adressen in der users-Collection zu verhindern.

Lassen Sie uns einen Unique-Index auf dem Feld email erstellen. Dies geschieht durch Hinzufügen der Option { unique: true } beim Erstellen des Index.

db.users.createIndex({ email: 1 }, { unique: true });

Nachdem der Unique-Index eingerichtet ist, lehnt MongoDB jeden Versuch ab, ein Dokument einzufügen oder zu aktualisieren, wenn dies zu einem doppelten Wert für das Feld email führt.

Testen wir dies. Versuchen Sie zunächst, ein Dokument mit einer neuen, eindeutigen E-Mail einzufügen. Dies sollte erfolgreich sein.

db.users.insertOne({ name: "Frank", age: 31, email: "frank@example.com" });

Versuchen Sie als Nächstes, ein weiteres Dokument mit einer vorhandenen E-Mail, z. B. alice@example.com, einzufügen. Diese Operation schlägt fehl. Der try...catch-Block ermöglicht es Ihnen, den Fehler zu sehen, ohne die Verbindung zur mongosh-Shell zu trennen.

try {
  db.users.insertOne({ name: "Fiona", age: 29, email: "alice@example.com" });
} catch (e) {
  print(e);
}

Der Befehl löst einen Fehler aus, der auf eine Verletzung des doppelten Schlüssels hinweist. Die Ausgabe enthält eine Meldung wie E11000 duplicate key error collection.

Sie können Ihre Indizes erneut anzeigen, um die Eigenschaft der eindeutigen Einschränkung zu sehen.

db.users.getIndexes();

Beachten Sie in der Ausgabe die Eigenschaft unique: true für den Index email_1.

[
  ...,
  {
    v: 2,
    key: { email: 1 },
    name: 'email_1',
    unique: true
  }
]

Indexnutzung mit explain() analysieren

Das Erstellen von Indizes ist nur die halbe Miete; Sie müssen auch überprüfen, ob MongoDB diese tatsächlich für Ihre Abfragen verwendet. Die explain()-Methode ist ein leistungsstarkes Werkzeug dafür und liefert detaillierte Informationen darüber, wie eine Abfrage ausgeführt wird. Dieser Schritt zeigt Ihnen, wie Sie explain() verwenden, um zu überprüfen, ob MongoDB Ihre vorhandenen Indizes effektiv nutzt.

Analysieren wir eine Abfrage, die Benutzer eines bestimmten Alters findet. Da wir bereits den zusammengesetzten Index age_-1_name_1 aus dem vorherigen Schritt haben, kann MongoDB diesen Index verwenden, um die Abfrage auf dem Feld age zu optimieren.

db.users.find({ age: 35 }).explain("executionStats");

Suchen Sie in der Ausgabe im Feld winningPlan nach dem Feld executionStats.stage. Sie sollten den Wert IXSCAN sehen, was für "Index Scan" steht. Dies zeigt an, dass MongoDB den vorhandenen zusammengesetzten Index age_-1_name_1 verwendet, um die relevanten Dokumente schnell zu lokalisieren. Sie sollten auch sehen, dass totalDocsExamined der Anzahl der zurückgegebenen Dokumente entspricht, was die Effizienz der Verwendung des zusammengesetzten Indexes demonstriert.

Um besser zu verstehen, wie MongoDB Indizes auswählt, testen wir auch eine Abfrage, die von dem zuvor erstellten Einzel-Feld-Index name profitieren kann.

db.users.find({ name: "Alice" }).explain("executionStats");

Diese Abfrage sollte ebenfalls IXSCAN als winningPlan-Stage anzeigen und bestätigen, dass MongoDB den im ersten Schritt erstellten Index name_1 verwendet.

Indizes anzeigen und löschen

Der letzte Teil der Indexverwaltung besteht darin, zu wissen, wie man sie auflistet und entfernt, wenn sie nicht mehr benötigt werden. Unbenutzte Indizes verbrauchen weiterhin Speicherplatz und erhöhen den Aufwand für Schreiboperationen, daher ist es eine gute Praxis, sie aufzuräumen.

Zuerst erhalten wir eine vollständige Liste aller Indizes, die Sie bisher in der users-Collection erstellt haben.

db.users.getIndexes();

Dieser Befehl bietet einen umfassenden Überblick über Ihre aktuelle Indexkonfiguration. Angenommen, Sie entscheiden, dass der zusammengesetzte Index age_-1_name_1 nicht mehr benötigt wird. Sie können ihn mit der Methode dropIndex() entfernen, indem Sie den Indexnamen angeben.

db.users.dropIndex("age_-1_name_1");

Nachdem Sie den Befehl ausgeführt haben, erhalten Sie eine Bestätigungsnachricht. Um sicherzugehen, können Sie die Indizes noch einmal auflisten, um zu überprüfen, ob er entfernt wurde.

db.users.getIndexes();

Der Index age_-1_name_1 sollte nicht mehr in der Liste erscheinen.

Wenn Sie alle benutzerdefinierten Indizes aus einer Collection entfernen müssen (mit Ausnahme des Standard-_id-Index), können Sie die Methode dropIndexes() verwenden. Dieser Befehl ist mächtig, verwenden Sie ihn also mit Vorsicht.

// Beispiel: db.users.dropIndexes()

Damit sind die grundlegenden Operationen zur Verwaltung von Indizes in MongoDB abgeschlossen. Sie können nun die mongosh-Shell verlassen.

exit;

Zusammenfassung

In diesem Lab haben Sie die wesentlichen Fähigkeiten für die Arbeit mit MongoDB-Indizes erlernt. Sie haben mit der Erstellung eines einfachen Single-Field-Index begonnen, um einfache Abfragen zu beschleunigen. Anschließend haben Sie einen Compound-Index erstellt, um Abfragen mit mehreren Feldern zu optimieren. Sie haben auch gelernt, wie Sie die Datenintegrität durch die Erstellung eines Unique-Index sicherstellen können. Darüber hinaus haben Sie die Methode explain() verwendet, um Abfragepläne zu analysieren und zu bestätigen, dass Ihre Indizes effektiv genutzt wurden, und dabei den Leistungsunterschied zwischen einem Collection Scan und einem Index Scan beobachtet. Schließlich haben Sie Ihre Indizes verwaltet, indem Sie sie aufgelistet und gelöscht haben. Die Beherrschung dieser Indizierungstechniken ist ein entscheidender Schritt zum Aufbau schneller und skalierbarer Anwendungen mit MongoDB.