In diesem Abschnitt wird die Indexierung für die Firestore Enterprise-Version beschrieben. In der Firestore Enterprise-Version werden standardmäßig keine Indexe erstellt. Wenn Sie Kosten senken und die Datenbankleistung verbessern möchten, erstellen Sie Indexe für die am häufigsten verwendeten Abfragen.
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, da die Menge der zu scannenden Daten und der Aufwand für das 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
- einen Indexmodus für jedes Feld, entweder aufsteigend, absteigend oder „array-contains“
Ein Index kann auch die Optionen sparse 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 | population (descending), country (ascending), |
Wenn Sie einen Index für eine Abfrage erstellen, fügen Sie die Felder in derselben Reihenfolge wie in der Abfrage ein.
Indexdichte
Standardmäßig werden in Indexeinträgen Daten aus allen Dokumenten in einer Sammlung gespeichert. Dies wird als nicht dünnbesetzter 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 so behandelt, als hätten sie den Wert NULL. Wenn Sie dieses Verhalten ändern möchten, können Sie den Index als dünnbesetzten 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 dünnbesetzter Index reduziert die Speicherkosten und kann die Leistung verbessern.
Array-contains-Indexe
Wenn Sie die Abfrageleistung beim Abfragen eines Arrayfelds mit array-contains oder array-contains-any optimieren möchten, können Sie das Feld im Modus array-contains indexieren. Ein Index kann höchstens ein Feld im Modus array-contains haben.
Wenn Sie ein Arrayfeld im array-contains-Modus indexieren, kann die Abfrage-Engine Dokumente mit bestimmten Arraywerten schnell finden. Ohne Index werden die Arraywerte durch einen vollständigen Scan der Sammlung geprüft. Dadurch erhöhen sich die Abfragelatenzen und Lesekosten, wenn die Sammlung größer wird.
Damit ein Arrayfeld indexiert werden kann, muss es die folgende Anforderung erfüllen:
- Anforderung für nicht leere Arrays: Ein Indexeintrag wird nur erstellt, wenn das Arrayfeld im Dokument vorhanden und nicht leer ist. Dokumente mit fehlenden, nicht-Array- oder leeren Array-Feldern werden nicht indexiert.
Beziehung zwischen Dichte und „array-contains“-Indexen
Bei Indexen, die ein array-contains-Feld enthalten, gelten die Regeln für die Indexdichte nur für die sortierten indexierten Felder. Wenn die Anforderung für nicht leere Arrays erfüllt ist, gelten die Dichteregeln für die verbleibenden sortierten indexierten Felder im Index:
- Nicht dünnbesetzter Index (
DENSE): Für das Dokument wird ein Indexeintrag generiert. Alle fehlenden sortierten indexierten Felder im Index werden im Indexeintrag alsnullgespeichert. - Dünnbesetzter Index (
SPARSE): Ein Indexeintrag wird nur generiert, wenn mindestens eines der geordneten indexierten Felder im Dokument vorhanden ist.
Beispiel: Indexeinträge generieren
Betrachten Sie den Index users (tags[*], status ASC):
| Dokument | NON-SPARSE-Index |
SPARSE-Index |
|---|---|---|
{ |
Indexiert: • (Tags: "news", Status: "active") |
Indexiert: • (Tags: "news", Status: "active") |
{ |
Indexiert: • (Tags: "news", Status: "active") • (Tags: "sports", Status: "active") |
Indexiert: • (Tags: "news", Status: "active") • (Tags: "sports", Status: "active") |
{ |
Indexiert: • (Tags: "news", Status: "active") (dedupliziert) |
Indexiert: • (Tags: "news", Status: "active") (dedupliziert) |
{ |
Indexiert: • (Tags: null, Status: "active") |
Indexiert: • (Tags: null, Status: "active") |
{ |
Indexiert: • (Tags: "news", Status: null) |
Nicht indexiert (Feld status fehlt) |
{ |
Nicht indexiert (Feld ist kein Array) | Nicht indexiert (Feld ist kein Array) |
{ |
Nicht indexiert (Feld ist kein Array) | Nicht indexiert (Feld ist kein Array) |
{ |
Nicht indexiert (Feld tags fehlt) |
Nicht indexiert (Feld tags fehlt) |
{ |
Nicht indexiert (leeres Array) | Nicht indexiert (leeres Array) |
Beispielabfrage
Web
// Query for users where 'tags' contains 'news' and 'status' is 'active' const query = db.collection("users") .where("tags", "array-contains", "news") .where("status", "==", "active"); // Documents returned by the query: // [ // { // "id": "alice", // "tags": ["news", "tech"], // "status": "active" // } // ]
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 die Indexerstellung fehl und in den Vorgangsdetails wird eine Fehlermeldung angezeigt.
Fehlende Felder in einem eindeutigen Index
Wenn Sie ein Dokument mit fehlenden Feldern für den eindeutigen Index einfügen, legt der Index null-Werte für die fehlenden Felder fest. Der resultierende Indexeintrag muss eindeutig sein, sonst schlägt der Vorgang fehl.
Beispiel für diesen Index:
| Sammlung | Indexierte Felder | Abfragebereich |
|---|---|---|
| Städte | Name (aufsteigend) | Sammlung |
Wenn Sie das Dokument {"abbreviation": "LA"} der Sammlung hinzufügen, wird im eindeutigen Index ein Eintrag erstellt, bei dem name auf null gesetzt ist. 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.
Beim Erstellen oder Aktualisieren eines Dokuments werden fehlende indexierte Felder auf null gesetzt und der resultierende Indexeintrag muss im Index eindeutig sein.
Eindeutige Indexe für Arraywerte
Ein eindeutiger array-contains-Index verhindert Dokumente mit sich überschneidenden Array-Elementen.
Bei diesem Indextyp wird nicht erzwungen, dass ein Array eindeutige Werte innerhalb eines einzelnen Dokuments hat.
Beispiel mit einem eindeutigen Index für ein Feld namens tags:
Das folgende Dokument, doc1, ist gültig und kann eingefügt werden:
{
"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, doc2, mit einem doppelten Element einzufügen, schlägt der Vorgang fehl:
{
"tags": [ "sports", "music" ]
}
Der Vorgang schlägt fehl, da "music" bereits im Array von doc1 vorhanden und im Index zugeordnet ist.
Wenn Sie sicherstellen müssen, dass Elemente innerhalb desselben Arrays in einem einzelnen Dokument eindeutig sind, müssen Sie dies in Ihrer Anwendungslogik berücksichtigen.
Leere Arrays, fehlende Felder und Nullwerte
Normalerweise werden fehlende Felder in einem eindeutigen Index als null behandelt und müssen in allen Dokumenten 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, vollständig fehlt oder einen eigenständigen
null-Wert enthält (nicht innerhalb eines Arrays), werden für das Dokument keine Indexschlüssel generiert. Daher können mehrere Dokumente leere Felder oder eigenständigenull-Werte enthalten, ohne dass Fehler wegen doppelter Schlüssel ausgelöst werden. - Null-Elemente 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 im indexierten Arrayfeld enthält, wird ein Fehler aufgrund eines doppelten Schlüssels ausgegeben.
Fehler beim Indexaufbau beheben
Beim Verwalten Ihrer Indexe können Fehler beim Indexaufbau auftreten. Ein Indexierungsvorgang kann fehlschlagen, wenn die Datenbank ein Problem mit den Daten feststellt. Indexierungsvorgänge können 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 ein Indexlimit nicht erreicht haben, wiederholen Sie den Indexvorgang.
- Sie haben die Option für eindeutige Indexe festgelegt und die Daten der indexierten Felder würden doppelte Indexeinträge erstellen. Entfernen Sie doppelte Wertekombinationen aus den Daten, um fortzufahren.
Nächste Schritte
Indexe erstellen und verwalten