MongoDB-Indexe verwenden

MongoDBMongoDBBeginner
Jetzt üben

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

Einführung

In diesem Labyrinth lernen Sie die Grundlagen des Einsatzes von MongoDB-Indexen, um die Abfrageleistung und Sortieroperationen zu optimieren. Das Labyrinth umfasst mehrere Schlüsselschritte, darunter das Abfragen mit Indexen, das Sortieren mit Indexen, das Überprüfen der Indexabdeckung, das Behandeln fehlender Indexe und das Entfernen nicht genutzter Indexe. Am Ende des Labyrinths werden Sie eine solide Vorstellung davon haben, wie Sie die Indexfähigkeiten von MongoDB nutzen, um die Effizienz Ihrer Datenbankanwendungen zu verbessern.

Das Labyrinth beginnt mit der Erstellung einer Beispielsamling und zeigt, wie Sie einen Index auf einem bestimmten Feld erstellen, um die Abfragen zu beschleunigen. Anschließend wird untersucht, wie Indexe für Sortieroperationen verwendet werden und wie die Indexabdeckung für eine gegebene Abfrage überprüft wird. Das Labyrinth behandelt auch Szenarien, in denen ein Index fehlt, und wie solche Fälle behandelt werden, sowie den Prozess des Entfernens nicht genutzter Indexe, um eine gesunde Datenbank zu erhalten.

Abfrage mit Index

In diesem Schritt lernen Sie, wie Sie Indexe verwenden, um die Abfrageleistung in MongoDB zu optimieren. Indexe sind spezielle Datenstrukturen, die einen kleinen Teil des Datensatzes einer Sammlung in einer leicht durchlaufbaren Form speichern, was die Datenbankabfragen viel schneller macht.

Lassen Sie uns zunächst damit beginnen, die MongoDB-Shell zu öffnen:

mongosh

Jetzt erstellen wir eine Beispielsamling mit einigen Daten, um die Indexierung zu demonstrieren:

use indexlab

db.users.insertMany([
    { name: "Alice", age: 28, city: "New York" },
    { name: "Bob", age: 35, city: "San Francisco" },
    { name: "Charlie", age: 42, city: "Chicago" },
    { name: "David", age: 25, city: "New York" },
    { name: "Eve", age: 31, city: "San Francisco" }
])

Lassen Sie uns einen Index auf das Feld 'age' erstellen, um die Abfragen zu beschleunigen:

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

Die 1 gibt einen aufsteigenden Index an. Jetzt führen wir eine Abfrage aus und überprüfen ihre Leistung:

db.users.find({ age: { $gt: 30 } }).explain("executionStats");

Dieser Befehl zeigt Ihnen die Details der Abfrageausführung, einschließlich der Verwendung des Indexes.

Beispielausgabe:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "indexName": "age_1"
      }
    }
  },
  "executionStats": {
    "executionTimeMillis": 0,
    "totalDocsExamined": 2,
    "totalKeysExamined": 2
  }
}

Die wichtigsten Dinge, die Sie beachten sollten, sind:

  • IXSCAN zeigt an, dass der Index verwendet wurde
  • totalDocsExamined ist gering, was zeigt, dass der Index die Abfrage optimiert hat
  • executionTimeMillis ist sehr kurz

Sortieren mit Index

In diesem Schritt lernen Sie, wie Sie Indexe verwenden, um Sortieroperationen in MongoDB zu optimieren. Das Sortieren großer Datensätze kann rechenintensiv sein, aber mit dem richtigen Index können wir die Leistung erheblich verbessern.

Lassen Sie uns mit unserer bestehenden Datenbank aus dem vorherigen Schritt fortfahren:

use indexlab

Wir werden einen zusammengesetzten Index erstellen, der effizientes Sortieren ermöglicht:

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

Dieser zusammengesetzte Index wird uns helfen, nach Stadt in aufsteigender Reihenfolge und nach Alter in absteigender Reihenfolge zu sortieren. Lassen Sie uns eine Abfrage ausführen, die dies demonstriert:

db.users.find().sort({ city: 1, age: -1 }).explain("executionStats");

Beispielausgabe:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "SORT",
      "sortPattern": { "city": 1, "age": -1 },
      "inputStage": {
        "stage": "IXSCAN",
        "indexName": "city_1_age_-1"
      }
    }
  },
  "executionStats": {
    "executionTimeMillis": 0,
    "totalDocsExamined": 5,
    "totalKeysExamined": 5
  }
}

Jetzt schauen wir uns die tatsächlichen sortierten Ergebnisse an:

db.users.find().sort({ city: 1, age: -1 });

Wichtige Beobachtungen:

  • Der Index unterstützt das Sortieren nach mehreren Feldern
  • 1 bedeutet aufsteigende Reihenfolge
  • -1 bedeutet absteigende Reihenfolge
  • Die Abfrage verwendet den Index für effizientes Sortieren

Indexabdeckung prüfen

In diesem Schritt lernen Sie, wie Sie die Indexabdeckung prüfen und verstehen, wie MongoDB Indexe verwendet, um die Abfrageleistung zu optimieren. Die Indexabdeckung hilft Ihnen zu bestimmen, ob Ihre Abfragen die verfügbaren Indexe vollständig nutzen.

Lassen Sie uns mit unserer bestehenden Datenbank fortfahren:

use indexlab

Wir werden einen umfassenderer Index erstellen, um die Abdeckung zu demonstrieren:

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

Jetzt führen wir eine Abfrage aus, die unseren Index vollständig nutzen kann:

db.users.find({ name: "Alice", city: "New York" }).explain("executionStats");

Beispielausgabe:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "indexName": "name_1_city_1_age_1"
      }
    }
  },
  "executionStats": {
    "totalDocsExamined": 1,
    "totalKeysExamined": 1,
    "indexesUsed": ["name_1_city_1_age_1"]
  }
}

Lassen Sie uns eine Abfrage mit partieller Indexabdeckung prüfen:

db.users.find({ city: "New York" }).explain("executionStats");

Wichtige Beobachtungen:

  • totalDocsExamined zeigt, wie viele Dokumente überprüft wurden
  • totalKeysExamined gibt die Indexeffizienz an
  • indexesUsed zeigt, welche Indexe genutzt wurden

Um alle Indexe in der Sammlung aufzulisten:

db.users.getIndexes();

Fehlenden Index behandeln

In diesem Schritt lernen Sie, wie Sie Abfragen ohne Index behandeln und die Auswirkungen auf die Leistung von fehlenden Indexen in MongoDB verstehen.

Lassen Sie uns mit unserer bestehenden Datenbank fortfahren:

use indexlab

Zunächst führen wir eine Abfrage ohne Index aus, um ihre Leistung zu prüfen:

db.users.find({ email: "[email protected]" }).explain("executionStats");

Beispielausgabe:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "COLLSCAN",
      "direction": "forward"
    }
  },
  "executionStats": {
    "totalDocsExamined": 5,
    "executionTimeMillis": 0
  }
}

Wichtige Beobachtungen:

  • COLLSCAN zeigt einen Sammellauf (Prüfung jedes Dokuments) an
  • totalDocsExamined zeigt, dass alle Dokumente überprüft wurden

Lassen Sie uns einen Index erstellen, um die Leistung dieser Abfrage zu verbessern:

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

Führen Sie jetzt die gleiche Abfrage erneut aus:

db.users.find({ email: "[email protected]" }).explain("executionStats");

Beispielausgabe:

{
  "queryPlanner": {
    "winningPlan": {
      "stage": "FETCH",
      "inputStage": {
        "stage": "IXSCAN",
        "indexName": "email_1"
      }
    }
  },
  "executionStats": {
    "totalDocsExamined": 0,
    "totalKeysExamined": 0,
    "executionTimeMillis": 0
  }
}

Wichtige Verbesserungen:

  • IXSCAN ersetzt COLLSCAN
  • totalDocsExamined ist jetzt 0
  • Die Abfrageleistung ist erheblich verbessert

Um der bestehenden Benutzer die E-Mail hinzuzufügen:

db.users.updateMany({}, [
  {
    $set: {
      email: {
        $concat: [{ $toLower: "$name" }, "@example.com"]
      }
    }
  }
]);

Unverwendeten Index entfernen

In diesem Schritt lernen Sie, wie Sie in MongoDB unverwendete Indexe identifizieren und entfernen, um die Datenbankleistung und -speicherung zu optimieren.

Lassen Sie uns zunächst alle vorhandenen Indexe in unserer Sammlung anzeigen:

use indexlab
db.users.getIndexes()

Beispielausgabe:

[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { age: 1 }, name: 'age_1' },
  { v: 2, key: { city: 1, age: -1 }, name: 'city_1_age_-1' },
  { v: 2, key: { name: 1, city: 1, age: 1 }, name: 'name_1_city_1_age_1' },
  { v: 2, key: { email: 1 }, name: 'email_1' }
]

Um die Indexnutzung zu überprüfen, verwenden wir die $indexStats-Aggregation:

db.users.aggregate([{ $indexStats: {} }]);

Beispielausgabe:

[
  {
    name: 'age_1',
    key: { age: 1 },
    host: '...',
    accesses: {
      ops: 0,
      since: ISODate("...")
    }
  },
  //... andere Indexstatistiken
]

Lassen Sie uns einen unverwendeten Index entfernen. Wir werden den Index 'city1_age-1' entfernen:

db.users.dropIndex("city_1_age_-1");

Überprüfen, dass der Index entfernt wurde:

db.users.getIndexes();

Bewährte Methoden der Indexverwaltung:

  • Regelmäßig die Indexnutzung überprüfen
  • Indexe entfernen, die nicht häufig verwendet werden
  • Die Balance zwischen Abfrageleistung und Speicheraufwand berücksichtigen

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie MongoDB-Indexe verwenden, um die Abfrageleistung und Sortieroperationen zu optimieren. Zunächst haben Sie einen Index auf das 'age'-Feld erstellt und beobachtet, wie der Index verwendet wurde, um Abfragen zu beschleunigen, die auf dem 'age'-Feld filtern. Anschließend haben Sie einen zusammengesetzten Index erstellt, um eine effiziente Sortierung auf mehreren Feldern zu ermöglichen. Sie haben auch gelernt, wie Sie die Indexabdeckung prüfen und fehlende Indexe behandeln, sowie wie Sie unverwendete Indexe entfernen, um eine gesunde Indexstruktur aufrechtzuerhalten.