Index der Enterprise-Version

Das Indexierungsverhalten hängt von der Edition der Datenbank ab. Auf dieser Seite wird die Indexierung für die Firestore Enterprise-Edition beschrieben. Informationen zur Firestore Standard Edition finden Sie unter Firestore Standard Edition-Indexübersicht.

In diesem Abschnitt wird die Indexierung für die Firestore Enterprise-Version beschrieben. In der Firestore Enterprise-Version werden standardmäßig keine Indexe erstellt. Um Kosten zu senken und die Datenbankleistung zu verbessern, sollten Sie Indexe für Ihre am häufigsten verwendeten Abfragen erstellen.

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
  • einen Indexmodus für jedes Feld: aufsteigend, absteigend oder „array-contains“

Ein Index kann auch die Optionen sparse oder unique ermöglichen.

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 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 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.

„Array-contains“-Indizes

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 array-contains-Modus 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 in Abfragen durch einen vollständigen Scan der Sammlung geprüft. Dadurch erhöhen sich die Abfragelatenzen und Lesekosten mit zunehmender Größe der Sammlung.

Damit ein Arrayfeld indexiert werden kann, muss es die folgende Anforderung erfüllen:

  • Anforderung für nicht leeres Array:Ein Indexeintrag wird nur erstellt, wenn das Arrayfeld im Dokument vorhanden und ein nicht leeres Array ist. Dokumente mit fehlenden, nicht als Array definierten 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 ein nicht leeres Array erfüllt ist, gelten die Dichteregeln für die verbleibenden sortierten indexierten Felder im Index:

  • Nicht-sparse-Index (DENSE): Für das Dokument wird ein Indexeintrag generiert. Fehlende sortierte indexierte Felder im Index werden als null im Indexeintrag gespeichert.
  • Dünnbesetzter Index (SPARSE): Ein Indexeintrag wird nur generiert, wenn mindestens eines der sortierten indexierten Felder im Dokument vorhanden ist.

Beispiel: Indexeinträge erstellen

Betrachten Sie den Index users (tags[*], status ASC):

Dokument NON-SPARSE-Index SPARSE-Index
{
  tags: ["news"],
  status: "active"
}
Indexiert:
• (Tags: "news", Status: "active")
Indexiert:
• (Tags: "news", Status: "active")
{
  tags: ["news", "sports"],
  status: "active"
}
Indexiert:
• (Tags: "news", Status: "active")
• (Tags: "sports", Status: "active")
Indexiert:
• (Tags: "news", Status: "active")
• (Tags: "sports", Status: "active")
{
  tags: ["news", "news"],
  status: "active"
}
Indexiert:
• (Tags: "news", Status: "active") (dedupliziert)
Indexiert:
• (Tags: "news", Status: "active") (dedupliziert)
{
  tags: [null],
  status: "active"
}
Indexiert:
• (Tags: null, Status: "active")
Indexiert:
• (Tags: null, Status: "active")
{
  tags: ["news"]
}
Indexiert:
• (Tags: "news", Status: null)
Nicht indexiert (status-Feld fehlt)
{
  tags: "news",
  status: "active"
}
Nicht indexiert (Feld ist kein Array) Nicht indexiert (Feld ist kein Array)
{
  tags: null,
  status: "active"
}
Nicht indexiert (Feld ist kein Array) Nicht indexiert (Feld ist kein Array)
{
  status: "active"
}
Nicht indexiert (tags-Feld fehlt) Nicht indexiert (Feld tags fehlt)
{
  tags: [],
  status: "active"
}
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:

Sammlung Indexierte Felder Abfragebereich
Städte Name (aufsteigend) Sammlung

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 derselbe 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

Ein eindeutiger array-contains-Index verhindert Dokumente mit sich überschneidenden Array-Elementen.

Bei dieser Art von Index wird nicht erzwungen, dass ein Array eindeutige Werte innerhalb eines einzelnen Dokuments hat.

Beispiel mit einem eindeutigen Index für ein Feld mit dem Namen 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 dokumentübergreifend eindeutig sein (siehe Fehlende Felder in einem eindeutigen Index). Für eindeutige Indexe für Arrayfelder 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ändige null-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 das null-Element indexiert. Bei jedem nachfolgenden Dokument, das ein null-Element in seinem indexierten Arrayfeld enthält, tritt ein Fehler aufgrund eines doppelten Schlüssels auf.

Fehler beim Erstellen von Indexen 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. Möglicherweise wurde beispielsweise die maximale Anzahl von Indexeinträgen pro Dokument erreicht. Wenn die Indexerstellung fehlschlägt, wird eine Fehlermeldung angezeigt. Wenn Sie ein Indexlimit nicht erreicht haben, wiederholen Sie den Indexvorgang.
  • Sie haben die Option „Eindeutiger Index“ festgelegt und die Daten der indexierten Felder würden doppelte Indexeinträge erstellen. Entfernen Sie doppelte Kombinationen von Werten aus den Daten, um fortzufahren.