MongoDB-Indizes erstellen

MongoDBMongoDBBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden Sie die grundlegenden Konzepte und Techniken zum Erstellen von Indizes in MongoDB lernen. Das Lab umfasst die folgenden Schritte: Erstellen eines Indizes für ein einzelnes Feld, Erstellen eines zusammengesetzten Indizes, Festlegen eines eindeutigen Indizes, Überprüfen der Indexverwendung und Anzeigen der Indexliste. Diese Indexierungstechniken können die Leistung Ihrer MongoDB-Abfragen erheblich verbessern, indem die Datenabrufe optimiert werden. Das Lab bietet praktische Beispiele und Schritt-für-Schritt-Anleitungen, um Ihnen zu helfen, diese Indexierungskonzepte effektiv zu verstehen und anzuwenden.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/IndexingGroup(["Indexing"]) mongodb(("MongoDB")) -.-> mongodb/ErrorHandlingGroup(["Error Handling"]) mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/start_mongodb_shell("Start MongoDB Shell") mongodb/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") mongodb/BasicOperationsGroup -.-> mongodb/delete_document("Delete Document") mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/IndexingGroup -.-> mongodb/create_index("Create Index") mongodb/IndexingGroup -.-> mongodb/build_compound_index("Build Compound Index") mongodb/ErrorHandlingGroup -.-> mongodb/handle_write_errors("Handle Write Errors") subgraph Lab Skills mongodb/start_mongodb_shell -.-> lab-422078{{"MongoDB-Indizes erstellen"}} mongodb/insert_document -.-> lab-422078{{"MongoDB-Indizes erstellen"}} mongodb/delete_document -.-> lab-422078{{"MongoDB-Indizes erstellen"}} mongodb/find_documents -.-> lab-422078{{"MongoDB-Indizes erstellen"}} mongodb/query_with_conditions -.-> lab-422078{{"MongoDB-Indizes erstellen"}} mongodb/create_index -.-> lab-422078{{"MongoDB-Indizes erstellen"}} mongodb/build_compound_index -.-> lab-422078{{"MongoDB-Indizes erstellen"}} mongodb/handle_write_errors -.-> lab-422078{{"MongoDB-Indizes erstellen"}} end

Einfaches Feldindex erstellen

In diesem Schritt lernen Sie, wie Sie in MongoDB einen Index für ein einzelnes Feld erstellen, was die Abfrageleistung erheblich verbessern kann, indem das Datenabrufen beschleunigt wird.

Beginnen wir zunächst mit dem Start der MongoDB-Shell und der Vorbereitung unserer Umgebung:

mongosh

Sobald Sie in der MongoDB-Shell sind, erstellen wir eine Datenbank und eine Sammlung mit einigen Beispiel-Daten:

use indexlab
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" }
])

Erstellen wir nun einen Index für das Feld "age":

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

Die 1 gibt einen aufsteigenden Index an. Wenn Sie einen absteigenden Index möchten, verwenden Sie -1.

Um die Indexerstellung zu überprüfen, verwenden Sie den folgenden Befehl:

db.users.getIndexes();

Beispielausgabe:

[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { age: 1 }, name: 'age_1' }
]

Überprüfen wir die Leistungsverbesserung, indem wir eine Abfrage mit und ohne Index ausführen:

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

Die explain()-Methode zeigt Ihnen Details darüber, wie die Abfrage ausgeführt wird, einschließlich der Verwendung eines Indexes.

Zusammengesetzten Index erstellen

In diesem Schritt lernen Sie, wie Sie in MongoDB einen zusammengesetzten Index erstellen, der es ermöglicht, mehrere Felder zu indexieren, um komplexe Abfragen zu optimieren.

Fahren wir mit der Verwendung der Datenbank und der Sammlung aus dem vorherigen Schritt fort:

use indexlab

Ein zusammengesetzter Index ist ein Index über mehrere Felder. Wir werden einen Index erstellen, der die Felder "name" und "age" kombiniert, um die Abfrageleistung für Suchanfragen zu verbessern, die beide Felder betreffen:

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

Dadurch wird ein Index erstellt, bei dem die Dokumente zuerst alphabetisch aufsteigend nach Namen und dann ebenfalls aufsteigend nach Alter sortiert werden.

Fügen wir einige weitere Dokumente hinzu, um den zusammengesetzten Index zu demonstrieren:

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

Verifizieren wir nun den zusammengesetzten Index:

db.users.getIndexes();

Beispielausgabe:

[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { age: 1 }, name: 'age_1' },
  { v: 2, key: { name: 1, age: 1 }, name: 'name_1_age_1' }
]

Führen wir eine Abfrage aus, die von diesem zusammengesetzten Index profitieren kann:

db.users.find({ name: "David", age: 28 }).explain("executionStats");

Diese Abfrage wird den gerade erstellten zusammengesetzten Index verwenden, was die Abfrageleistung erheblich verbessern kann.

Eindeutigen Index festlegen

In diesem Schritt lernen Sie, wie Sie in MongoDB einen eindeutigen Index erstellen, der es verhindert, dass in einem bestimmten Feld oder einer Kombination von Feldern doppelte Werte auftreten.

Fahren wir mit der Verwendung unserer bestehenden Datenbank fort:

use indexlab

Ein eindeutiger Index gewährleistet, dass keine zwei Dokumente den gleichen Wert für das oder die indizierten Felder haben. Wir werden einen eindeutigen Index auf dem Feld "email" erstellen, um doppelte E-Mail-Adressen zu vermeiden:

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

Versuchen wir nun, Dokumente mit doppelten E-Mail-Adressen einzufügen:

// Dies wird erfolgreich sein
db.users.insertOne({
  name: "Grace",
  age: 29,
  email: "grace@example.com"
});

// Dies wird aufgrund des eindeutigen Index fehlschlagen
try {
  db.users.insertOne({
    name: "Henry",
    age: 30,
    email: "grace@example.com"
  });
} catch (e) {
  print("Duplikat-E-Mail-Fehler:", e.message);
}

Verifizieren wir den eindeutigen Index:

db.users.getIndexes();

Beispielausgabe:

[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { age: 1 }, name: 'age_1' },
  { v: 2, key: { name: 1, age: 1 }, name: 'name_1_age_1' },
  { v: 2, key: { email: 1 }, name: 'email_1', unique: true }
]

Sie können auch einen eindeutigen Index auf mehreren Feldern erstellen. Dies bedeutet, dass die Kombination dieser Felder eindeutig sein muss:

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

Dadurch können verschiedene Benutzer den gleichen Namen oder das gleiche Alter haben, aber nicht genau die gleiche Kombination von Namen und Alter.

Indexverwendung prüfen

In diesem Schritt lernen Sie, wie Sie die Indexverwendung in MongoDB mithilfe der explain()-Methode analysieren und verstehen, um die Abfrageleistung zu optimieren.

Fahren wir mit der Verwendung unserer bestehenden Datenbank fort:

use indexlab

Zunächst führen wir eine Abfrage ohne Angabe eines Indexes aus und untersuchen ihre Leistung:

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

Wichtige Punkte, die Sie im Ergebnis suchen sollten:

  • winningPlan.stage: Suchen Sie nach "COLLSCAN" (Sammlungsscan), was bedeutet, dass alle Dokumente durchsucht werden
  • totalDocsExamined: Anzahl der durchsuchten Dokumente
  • executionTimeMillis: Zeit, die für die Ausführung der Abfrage benötigt wird

Führen wir nun eine Abfrage aus, die unseren zuvor erstellten zusammengesetzten Index verwendet:

db.users
  .find({ name: "Alice", age: 28 })
  .hint({ name: 1, age: 1 })
  .explain("executionStats");

Die .hint()-Methode zwingt MongoDB, einen bestimmten Index zu verwenden. Vergleichen Sie dieses Ergebnis mit dem vorherigen:

  • winningPlan.stage sollte jetzt "FETCH" und "IXSCAN" anzeigen
  • totalDocsExamined sollte viel niedriger sein
  • executionTimeMillis sollte erheblich reduziert sein

Erstellen wir eine komplexere Abfrage, um die Indexverwendung zu demonstrieren:

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

db.users
  .find({
    email: { $gt: "d@example.com" },
    age: { $gte: 30 }
  })
  .explain("executionStats");

Diese Abfrage verwendet eine Bereichsbedingung für sowohl email als auch age, was von einem zusammengesetzten Index profitieren kann.

Das Beispielergebnis wird zeigen:

  • Wie der Index verwendet wird
  • Leistungsverbesserungen
  • Details über die Abfrageausführung

Indexliste anzeigen

In diesem letzten Schritt lernen Sie, wie Sie die Liste der Indizes in Ihrer MongoDB-Datenbank anzeigen und verwalten, was für das Verständnis und die Optimierung der Datenbankleistung von entscheidender Bedeutung ist.

Fahren wir mit der Verwendung unserer bestehenden Datenbank fort:

use indexlab

Um alle Indizes in der aktuellen Datenbank anzuzeigen, verwenden Sie die getIndexes()-Methode:

db.users.getIndexes();

Das Beispielergebnis sieht so aus:

[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { age: 1 }, name: 'age_1' },
  { v: 2, key: { name: 1, age: 1 }, name: 'name_1_age_1' },
  { v: 2, key: { email: 1 }, name: 'email_1', unique: true },
  { v: 2, key: { email: 1, age: 1 }, name: 'email_1_age_1' }
]

Lassen Sie uns detailliertere Informationen zu den Indizes erhalten:

db.users.getIndexes().forEach(function (index) {
  print("Index Name: " + index.name);
  print("Index Key: " + JSON.stringify(index.key));
  print("Unique: " + (index.unique ? "Yes" : "No"));
  print("---");
});

Um einen Index zu entfernen, verwenden Sie die dropIndex()-Methode. Entfernen wir den Index auf email:

db.users.dropIndex("email_1");

Verifizieren Sie, dass der Index entfernt wurde:

db.users.getIndexes();

Sie können auch mehrere Indizes auf einmal entfernen:

// Entfernen Sie mehrere bestimmte Indizes
db.users.dropIndexes(["name_1_age_1", "email_1_age_1"]);

Um alle benutzerdefinierten Indizes zu entfernen (der Standard-_id-Index bleibt erhalten):

db.users.dropIndexes();

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie in MongoDB einfache Feldindizes erstellen, um die Abfrageleistung zu verbessern, indem Sie schneller auf Daten zugreifen können. Sie haben auch das Erstellen zusammengesetzter Indizes untersucht, die komplexe Abfragen durch das Indizieren mehrerer Felder optimieren können. Darüber hinaus haben Sie gelernt, wie Sie eindeutige Indizes festlegen, um die Daten-Eindeutigkeit zu gewährleisten, die Indexverwendung prüfen und die Liste der Indizes für eine Sammlung anzeigen.

Die wichtigsten Erkenntnisse aus diesem Lab umfassen das Verständnis der Wichtigkeit von Indizes, der verschiedenen Indextypen (einfache Felder und zusammengesetzte) und der Verwaltung und Überwachung von Indizes in einer MongoDB-Datenbank. Diese Techniken können die Effizienz und Leistung Ihrer MongoDB-Anwendungen erheblich verbessern.