37 Indexierung in MongoDB

In MongoDB ermöglicht die Indexierung, Daten effizient zu durchsuchen, indem sie den Zugriff auf Dokumente in einer Sammlung beschleunigt. Ohne Index muss die Datenbank eine Collection-Scan durchführen, das heißt, jedes Dokument der Sammlung durchsuchen, was bei großen Datenmengen ineffizient ist.

37.1 Arten von Indizes in MongoDB

37.1.1 Einzelfeld-Index

Ein einzelner Feldindex wird für ein bestimmtes Feld erstellt. Dieser Typ beschleunigt Abfragen, die nach Werten in diesem Feld suchen.

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

Das 1 steht für eine aufsteigende Sortierung, -1 würde eine absteigende Sortierung bedeuten.

37.1.2 Zusammengesetzter Index

Ein zusammengesetzter Index umfasst mehrere Felder und wird verwendet, wenn Abfragen mehrere Felder gleichzeitig filtern oder sortieren.

db.collection.createIndex({ field1: 1, field2: -1 })

Hier ist field1 aufsteigend sortiert und field2 absteigend.

37.1.3 Textindex

Ein Textindex dient zur Volltextsuche in String-Feldern. Er kann auf ein oder mehrere Felder angewendet werden.

db.collection.createIndex({ fieldName: "text" })

37.1.4 Geospatial-Index

Ein Geodatenindex unterstützt Abfragen, die geographische Daten (z. B. Längen- und Breitengrade) durchsuchen.

db.collection.createIndex({ location: "2dsphere" })

37.1.5 Hashed Index

Ein gehashter Index wird für Felder verwendet, die für Sharding oder eindeutige Abfragen gehasht werden.

db.collection.createIndex({ fieldName: "hashed" })

37.1.6 TTL-Index (Time-to-Live)

Ein TTL-Index löscht automatisch Dokumente nach einer bestimmten Zeitspanne, die in einem Datumsfeld angegeben ist.

db.collection.createIndex({ fieldName: 1 }, { expireAfterSeconds: 3600 })

37.2 Wichtige Eigenschaften von Indizes

  1. Eindeutigkeit: Indizes können so definiert werden, dass sie eindeutig sind, was bedeutet, dass keine zwei Dokumente denselben Wert für das indizierte Feld besitzen dürfen.

    db.collection.createIndex({ fieldName: 1 }, { unique: true })
  2. Sparse-Index: Ein Sparse-Index indiziert nur Dokumente, die das angegebene Feld enthalten, wodurch Speicherplatz gespart werden kann.

    db.collection.createIndex({ fieldName: 1 }, { sparse: true })
  3. Partial-Index: Ein Partial-Index enthält nur Dokumente, die einer bestimmten Bedingung entsprechen.

    db.collection.createIndex({ fieldName: 1 }, { partialFilterExpression: { status: "active" } })

37.3 Indexierungsstrategie

  1. Abfrageanalyse mit Explain: Vor der Indexerstellung sollte die Abfrage mit .explain("executionStats") analysiert werden, um die benötigten Indizes zu identifizieren.

    db.collection.find({ fieldName: value }).explain("executionStats")
  2. Kombinierte Nutzung von Indizes: MongoDB kann mehrere Indizes in einer Abfrage kombinieren, wenn kein einzelner Index alle Filterbedingungen abdeckt.

  3. Sortierung optimieren: Ein Index kann sowohl für die Filterung als auch für die Sortierung genutzt werden, wenn die Sortierreihenfolge mit der Indexreihenfolge übereinstimmt.

37.4 Performance-Tipps

37.5 Beispiel: Optimierte Indexierung

Angenommen, wir haben eine Sammlung users mit folgenden Feldern:

{
  "name": "John Doe",
  "email": "john.doe@example.com",
  "age": 30,
  "location": [50.123, 8.456]
}
  1. Index für häufige Abfragen nach E-Mail:

    db.users.createIndex({ email: 1 })
  2. Geodatenindex für Standortabfragen:

    db.users.createIndex({ location: "2dsphere" })
  3. Kombinierter Index für Name und Alter:

    db.users.createIndex({ name: 1, age: -1 })
  4. TTL-Index für alte Sessions:

    db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 })

Durch strategisches Erstellen und Verwalten von Indizes kann die Performance einer MongoDB-Datenbank erheblich verbessert werden.