Übersicht über Indexe
Auf dieser Seite wird die Indexierung für Firestore mit MongoDB-Kompatibilität beschrieben. In Firestore mit MongoDB-Kompatibilität werden standardmäßig keine Indexe erstellt. Erstellen Sie Indexe für die am häufigsten verwendeten Abfragen, um die Datenbankleistung zu verbessern.
Indexe haben einen großen Einfluss auf die Leistung einer Datenbank. Wenn ein Index für eine Abfrage vorhanden ist, kann die Datenbank effizient Ergebnisse zurückgeben, indem die Menge der zu scannenden Daten und der Aufwand zum Sortieren der Ergebnisse reduziert werden. Indexeinträge erhöhen jedoch die Speicherkosten und den Arbeitsaufwand bei einem Schreibvorgang für indexierte Felder.
Indexdefinition und -struktur
Ein Index besteht aus Folgendem:
- eine Sammlungs-ID
- eine Liste der Felder in der angegebenen Sammlung
- eine Sortierreihenfolge für jedes Feld, entweder aufsteigend oder absteigend
Ein Index kann auch die Optionen sparse, multikey oder unique aktivieren.
Indexreihenfolge
Die Reihenfolge und Sortierrichtung der einzelnen Felder definieren den Index eindeutig. Die folgenden Indexe sind beispielsweise zwei unterschiedliche Indexe und nicht austauschbar:
| Sammlung | Felder |
|---|---|
| Städte | Land (aufsteigend), Bevölkerung (absteigend) |
| Städte | Bevölkerung (absteigend), Land (aufsteigend) |
Wenn Sie einen Index zur Unterstützung einer Abfrage erstellen, müssen Sie die Felder in derselben Reihenfolge wie in der Abfrage angeben.
Indexdichte
Standardmäßig werden in Indexeinträgen Daten aus allen Dokumenten in einer Sammlung gespeichert. Dies wird als nicht spärlicher Index bezeichnet. Für ein Dokument wird ein Indexeintrag hinzugefügt, unabhängig davon, ob das Dokument eines der im Index angegebenen Felder enthält. Nicht vorhandene Felder werden beim Generieren von Indexeinträgen als NULL-Werte behandelt. Um dieses Verhalten zu ändern, können Sie den Index als Sparse-Index definieren.
Dünnbesetzte Indexe
Ein dünnbesetzter Index indexiert nur die Dokumente in der Sammlung, die einen Wert (einschließlich Null) für mindestens eines der indexierten Felder enthalten. Ein Sparse-Index senkt die Speicherkosten und kann die Leistung verbessern.
Indexe mit mehreren Schlüsseln für Arraywerte
Wenn Sie einen Index für ein Feld mit Arraywerten erstellen, müssen Sie einen Index mit mehreren Schlüsseln erstellen. Mit einem regulären Index können keine Arraywerte indexiert werden. Ein Index mit mehreren Schlüsseln unterstützt bis zu ein Arrayfeld in der Indexdefinition und kann für Vorgänge verwendet werden, die Arraywerte durchlaufen.
Verwenden Sie Indexe mit mehreren Schlüsseln nur, wenn Sie Arraywerte indexieren müssen. Reguläre Indexe haben Vorteile bei der Verarbeitung einer Abfrage. Mit regulären Indexen lassen sich Werte in einem Bereich beispielsweise effizienter filtern.
Die folgenden Situationen führen zu Fehlern, wenn Sie mit Arraywerten und Indexen mit mehreren Schlüsseln arbeiten:
- Bei einem Vorgang wird versucht, einem Feld, das durch einen regulären Index indexiert wird, einen Arraywert hinzuzufügen. Wenn Sie den Arraywert hinzufügen möchten, müssen Sie die vorhandenen regulären Indexe für dieses Feld löschen und als Multikey-Indexe neu erstellen.
- Sie versuchen, einen regulären Index für ein Feld zu erstellen, das einen Arraywert enthält. Sie müssen entweder einen Index mit mehreren Schlüsseln erstellen oder die Arraywerte löschen.
- Bei einem Vorgang wird versucht, mehrere Felder mit Arraywerten zu indexieren. In einem Index mit mehreren Schlüsseln darf nicht mehr als ein Feld mit einem Arraywert vorhanden sein. Ändern Sie Ihr Datenmodell oder Ihre Indexdefinitionen, um fortzufahren.
- Sie versuchen, einen Index mit mehreren Schlüsseln zu erstellen, bei dem zwei Feldpfade ein gemeinsames Präfix wie
users.postsundusers.ziphaben.
Eindeutige Indexe
Legen Sie die Option für eindeutige Indexe fest, um eindeutige Werte für die indexierten Felder zu erzwingen. Bei Indexen für mehrere Felder muss jede Kombination von Werten im gesamten Index eindeutig sein. Die Datenbank lehnt alle Aktualisierungs- und Einfügevorgänge ab, bei denen versucht wird, Indexeinträge mit doppelten Werten zu erstellen. Wenn die Daten der indexierten Felder doppelte Werte enthalten und Sie versuchen, einen eindeutigen Index zu erstellen, schlägt der Indexaufbau mit einer Fehlermeldung in den Vorgangsdetails fehl.
Fehlende Felder in einem eindeutigen Index
Wenn Sie ein Dokument mit fehlenden Feldern für den eindeutigen Index einfügen, werden für die fehlenden Felder null-Werte festgelegt. Der resultierende Indexeintrag muss eindeutig sein, sonst schlägt der Vorgang fehl.
Beispiel:
db.cities.createIndex( { "name": 1 }, { unique: true } )
Wenn Sie das Dokument {"abbreviation": "LA"} der Sammlung hinzufügen, wird durch den eindeutigen Index ein Eintrag mit name auf null erstellt. Wenn Sie dann versuchen, das Dokument {"abbreviation": "NYC"} hinzuzufügen, schlägt der Vorgang fehl, da der resultierende Eintrag für den eindeutigen Index identisch ist.
Das gleiche Verhalten gilt für eindeutige Indexe mit mehreren Feldern.
Wenn Sie ein Dokument erstellen oder aktualisieren, werden fehlende indexierte Felder auf null gesetzt und der resultierende Indexeintrag muss im Index eindeutig sein.
Eindeutige Indexe für Arraywerte
Mit einem eindeutigen Multikey-Index kann erzwungen werden, dass Dokumente keine sich überschneidenden Array-Elemente haben.
Bei dieser Art von Index wird nicht erzwungen, dass ein Array eindeutige Werte innerhalb eines einzelnen Dokuments hat.
Beispiel mit einem eindeutigen Index:
db.collection.createIndex( { "tags": 1 }, { unique: true } )
Das folgende Dokument kann eingefügt werden:
{
"_id": 1,
"tags": [ "news", "tech", "news", "music" ]
}
Der Index lässt doppelte Werte ("news") innerhalb desselben Arrays eines einzelnen Dokuments zu.
Wenn Sie versuchen, ein zweites Dokument mit einem doppelten Element einzufügen, schlägt der Vorgang fehl:
{
"_id": 2,
"tags": [ "sports", "music" ]
}
Der Vorgang ist fehlgeschlagen, weil "music" bereits im Array von Dokument 1 vorhanden und im Index zugeordnet ist.
Wenn Sie sicherstellen müssen, dass Elemente innerhalb desselben Arrays in einem einzelnen Dokument eindeutig sind, können Sie dies in Ihrer Anwendungslogik mit Aktualisierungsoperatoren wie $addToSet anstelle von $push erreichen.
Leere Arrays, fehlende Felder und Nullwerte
Normalerweise werden fehlende Felder in einem eindeutigen Index als null behandelt und müssen dokumentübergreifend eindeutig sein (siehe Fehlende Felder in einem eindeutigen Index).
Für eindeutige Indexe in Arrayfeldern gilt jedoch Folgendes:
- Leere Arrays, fehlende Felder und eigenständige Nullwerte:Wenn das Arrayfeld leer ist, ganz fehlt oder einen eigenständigen
null-Wert (nicht in einem Array) enthält, werden keine Indexschlüssel für das Dokument generiert. Daher können mehrere Dokumente leere Felder oder eigenständigenull-Werte enthalten, ohne dass Fehler aufgrund doppelter Schlüssel ausgelöst werden. - Nullelemente in einem Array:Wenn das Array einen
null-Wert als Element enthält (z. B.["news", null]), wird dasnull-Element indexiert. Bei jedem nachfolgenden Dokument, das einnull-Element in seinem indexierten Arrayfeld enthält, tritt ein Fehler aufgrund eines doppelten Schlüssels auf.
TTL-Indizes
Mit TTL-Indizes werden veraltete Daten automatisch aus Ihren Datenbanken entfernt. Mit einem TTL-Index wird ein bestimmtes Feld als Ablaufzeit für Dokumente in einer bestimmten Sammlung festgelegt. Mit TTL können Sie die Speicherkosten senken, indem Sie veraltete Daten entfernen. Daten werden in der Regel innerhalb von 24 Stunden nach ihrem Ablaufdatum gelöscht.
Fehler beim Indexaufbau beheben
Beim Verwalten Ihrer Indexe können Fehler beim Indexaufbau auftreten. Ein Indexierungsvorgang kann fehlschlagen, wenn in der Datenbank ein Problem mit den Daten auftritt. Die Indexierung kann aus folgenden Gründen fehlschlagen:
- Sie haben ein Indexlimit erreicht. Beispielsweise kann der Vorgang die maximale Anzahl von Indexeinträgen pro Dokument erreicht haben. Wenn die Indexerstellung fehlschlägt, wird eine Fehlermeldung angezeigt. Wenn Sie kein Indexlimit erreicht haben, versuchen Sie es noch einmal.
- Ein Index mit mehreren Schlüsseln ist erforderlich. Mindestens eines der indexierten Felder enthält einen Array-Wert. Um fortzufahren, müssen Sie entweder einen Index mit mehreren Schlüsseln verwenden oder die Arraywerte löschen.
- Bei einem Vorgang wird versucht, mehrere Felder mit Arraywerten zu indexieren. In einem Index mit mehreren Schlüsseln darf es nur ein Feld mit einem Arraywert geben. Ändern Sie Ihr Datenmodell oder Ihre Indexdefinitionen, um fortzufahren.
- Sie haben die Option für eindeutige Indexe festgelegt und die Daten der indexierten Felder würden doppelte Indexeinträge erstellen. Entfernen Sie doppelte Kombinationen von Werten aus den Daten, um fortzufahren.