Indexierung

Indexe sind ein wichtiger Faktor für die Leistung einer Datenbank. Ähnlich wie der Index (bzw. das Register) eines Buchs, in dem die Seitenzahlen zu den Themen im Buch stehen, gibt ein Datenbankindex die Positionen der Elemente in der Datenbank an. Wenn Sie eine Abfrage an eine Datenbank senden, kann die Datenbank einen Index verwenden, um schnell die Positionen der angeforderten Elemente zu ermitteln.

Auf dieser Seite werden die beiden von Firestore verwendeten Indextypen erläutert: Einzelfeldindexe und zusammengesetzte Indexe.

Indexdefinition und -struktur

Ein Index wird für eine Liste von Feldern eines bestimmten Dokuments definiert, mit einem entsprechenden Indexmodus für jedes Feld.

Ein Index enthält einen Eintrag für jedes Feld, das in der Definition des Index genannt wird. Der Index enthält alle Dokumente, die basierend auf dem Index die potenziellen Ergebnisse für Abfragen sind. Ein Dokument wird nur dann in den Index aufgenommen, wenn für jedes im Index verwendete Feld ein indexierter Wert festgelegt ist. Wenn sich die Indexdefinition auf ein Feld bezieht, für das im Dokument kein Wert festgelegt ist, wird dieses Dokument nicht im Index angezeigt und daher nie als Ergebnis für eine auf dem Index basierende Abfrage zurückgegeben.

Der zusammengesetzte Index wird nach Feldwerten in der in der Indexdefinition angegebenen Reihenfolge sortiert.

Ein Index hinter jeder Abfrage

Wenn für eine Abfrage kein Index vorhanden ist, erfassen die meisten Datenbanken die in ihnen enthaltenen Elemente nach und nach. Das ist ein langsamer Vorgang, der mit zunehmender Datenbankgröße auch immer mehr Zeit benötigt. Firestore garantiert eine hohe Abfrageleistung durch Nutzung von Indexen für alle Abfragen. Dadurch hängt die Abfrageleistung von der Größe der Ergebnismenge und nicht von der Anzahl der Elemente in der Datenbank ab.

Weniger Indexverwaltung, mehr Anwendungsentwicklung

Firestore bietet Features, mit denen sich der Zeitaufwand für die Indexverwaltung reduzieren lässt. Die für grundlegende Abfragen erforderlichen Indexe werden automatisch für Sie erstellt. Wenn Sie Ihre Anwendung verwenden und testen, bietet Firestore eine Unterstützung für das Ermitteln und Erstellen zusätzlicher Indexe, die von der Anwendung benötigt werden.

Indexarten

Firestore nutzt zwei Arten von Indexen: Einzelfeldindexe und zusammengesetzte Indexe. Neben der Anzahl der indexierten Felder unterscheiden sich Einzelfeldindexe und zusammengesetzte Indexe hinsichtlich der Art und Weise der Verwaltung.

Einzelfeldindexe

Bei einem Einzelfeldindex wird eine sortierte Zuordnung aller Dokumente, die ein bestimmtes Feld enthalten, in einer Sammlung gespeichert. Jeder Eintrag in einem Einzelfeldindex erfasst den Wert eines Dokuments für ein bestimmtes Feld sowie die Position des Dokuments in der Datenbank. Firestore nutzt diese Indexe für viele grundlegende Abfragen. Zum Verwalten von Einzelfeldindexen müssen Sie die Einstellungen der Datenbank für die automatische Indexierung sowie die Indexausnahmen konfigurieren.

Automatische Indexierung

Standardmäßig verwaltet Firestore automatisch Einzelfeldindexe für jedes Feld in einem Dokument und für jedes Unterfeld in einer Map. Bei Firestore gelten für Einzelfeldindexe die folgenden Standardeinstellungen:

  • Für jedes Nicht-Arrayfeld und jedes Nicht-Map-Feld definiert Firestore zwei Einzelfeldindexe im Sammlungsbereich: einen im aufsteigenden und einen im absteigenden Modus.

  • Für jedes Kartenfeld erstellt Firestore Folgendes:

    • Ein aufsteigender Index für den Sammlungsbereich für jedes Nicht-Array- und Nicht-Zuordnungs-Unterfeld.
    • Ein absteigender Index für den Sammlungsbereich für jedes Nicht-Array- und Nicht-Zuordnungs-Unterfeld.
    • Ein „array-contains“-Index des Sammlungsbereichs für jedes Array-Teilfeld.
    • Firestore indexiert jedes Unterfeld der Karte rekursiv.
  • Für jedes Arrayfeld in einem Dokument erstellt und verwaltet Firestore einen "Array-contains"-Index des Sammlungsbereichs.

  • Einzelfeldindexe mit Sammlungsgruppenbereich werden nicht standardmäßig bereitgestellt.

Einzelfeldindex-Ausnahmen

Sie können ein Feld durch Erstellen einer Einzelfeldindex-Ausnahme von der automatischen Indexierung ausschließen. Eine Indexausnahme überschreibt die datenbankweiten Einstellungen für die automatische Indexierung. Eine Ausnahme kann einen Einzelfeldindex aktivieren, der durch die Einstellungen für die automatische Indexierung ansonsten deaktiviert werden würde, oder einen Einzelfeldindex deaktivieren, der durch die Einstellungen für die automatische Indexierung ansonsten aktiviert werden würde. Beispiele für Fälle, in denen Ausnahmen nützlich sein können, finden Sie in den Best Practices zur Indexierung.

Verwenden Sie den Feldpfadwert *, um Indexausnahmen auf Sammlungsebene für alle Felder in einer Sammlungsgruppe hinzuzufügen. Legen Sie beispielsweise für die Sammlungsgruppe comments den Feldpfad auf * fest, damit alle Felder in der Sammlungsgruppe comments übereinstimmen, und deaktivieren Sie die Indexierung aller Felder in der Sammlungsgruppe. Sie können dann Ausnahmen hinzufügen, um nur die Felder zu indexieren, die für Ihre Abfragen erforderlich sind. Wenn Sie die Anzahl der indexierten Felder reduzieren, sinken die Speicherkosten und die Schreibleistung kann verbessert werden.

Wenn Sie eine Einzelfeldindex-Ausnahme für ein Map-Feld erstellen, werden diese Einstellungen für die Unterfelder der Karte übernommen. Sie können jedoch Einzelfeldindex-Ausnahmen für bestimmte Unterfelder definieren. Wenn Sie eine Ausnahme für ein Unterfeld löschen, übernimmt das Unterfeld die Ausnahme-Einstellungen des übergeordneten Felds, sofern vorhanden, und ansonsten die datenbankweiten Einstellungen.

Informationen zum Erstellen und Verwalten von Einzelfeldindex-Ausnahmen finden Sie unter Indexe in Firestore verwalten.

Zusammengesetzte Indexe

Ein zusammengesetzter Index speichert eine sortierte Zuordnung aller Dokumente in einer Sammlung anhand einer sortierten Liste von Feldern, die indexiert werden sollen.

Firestore nutzt zusammengesetzte Indexe für Abfragen, die noch nicht von Einzelfeldindexen unterstützt werden.

Bei Firestore werden zusammengesetzte Indexe aufgrund der großen Anzahl möglicher Feldkombinationen nicht wie Einzelfeldindexe automatisch erstellt. Stattdessen bietet Firestore eine Unterstützung für das Ermitteln und Erstellen der erforderlichen zusammengesetzte Indexe, wenn Sie Ihre Anwendung entwickeln.

Wenn Sie die obige Abfrage ausführen, ohne zuvor den erforderlichen Index zu erstellen, gibt Firestore eine Fehlermeldung mit einem Link aus, über den Sie den fehlenden Index anlegen können. Dies erfolgt jedes Mal, wenn Sie eine Abfrage auszuführen versuchen, die vom jeweiligen Index nicht unterstützt wird. Sie können zusammengesetzte Indexe auch manuell definieren oder verwalten, indem Sie die Console oder Firebase CLI verwenden. Weitere Informationen zum Erstellen und Verwalten von zusammengesetzten Indexen finden Sie unter Indexe verwalten.

Indexmodi und Abfragebereiche

Sie konfigurieren Einzelfeldindexe und zusammengesetzte Indexe unterschiedlich, aber beide erfordern das Konfigurieren von Indexmodi und Abfragebereichen.

Indexmodi

Wenn Sie einen Index definieren, wählen Sie für jedes indexierte Feld einen Indexmodus aus. Der Indexmodus jedes Felds unterstützt bestimmte Abfrageklauseln für das Feld. Sie können aus den folgenden Indexmodi auswählen:

Indexmodus Beschreibung
Aufsteigend  Unterstützt Abfrageklauseln des Typs <, <=, ==, >=, >, !=, in und not-in für das Feld sowie Sortierergebnisse in aufsteigender Reihenfolge basierend auf dem Feldwert.
Absteigend  Unterstützt Abfrageklauseln des Typs <, <=, ==, >=, >, !=, in und not-in für das Feld sowie Sortierergebnisse in absteigender Reihenfolge basierend auf dem Feldwert.
Array‑contains Unterstützt array-contains- und array-contains-any-Abfrageklauseln für das Feld
Vektor Unterstützt FindNearest-Abfrageklauseln für das Feld

Abfrageumfänge

Jeder Index ist entweder einer Sammlung oder einer Sammlungsgruppe zugeordnet. Dies wird als Abfragebereich des Index bezeichnet.

Sammlungsbereich
Firestore erstellt standardmäßig Indexe mit Sammlungsbereich. Diese Indexe unterstützen Abfragen, die Ergebnisse aus einer einzelnen Sammlung zurückgeben.

Umfang der Sammlungsgruppe
Eine Sammlungsgruppe enthält alle Sammlungen mit derselben Sammlungs-ID. Um eine Sammlungsgruppenabfrage auszuführen, die gefilterte oder geordnete Ergebnisse aus einer Sammlungsgruppe zurückgibt, müssen Sie einen entsprechenden Index mit Sammlungsgruppenbereich erstellen.

Standardsortierung und das Feld __name__

Zusätzlich zum Sortieren der Dokumente nach den für jedes Feld angegebenen Indexmodi (aufsteigend oder absteigend) erfolgt bei Indexen auch eine endgültige Sortierung nach dem Feld __name__ jedes Dokuments. Der Wert des Felds __name__ wird auf den vollständigen Dokumentpfad festgelegt. Das bedeutet, dass Dokumente in der Ergebnismenge mit denselben Feldwerten nach Dokumentpfad sortiert werden.

Standardmäßig wird das Feld __name__ in der gleichen Richtung sortiert wie das letzte sortierte Feld in der Indexdefinition. Beispiel:

Sammlung Indexierte Felder Abfragebereich
cities Name von , __name__ Sammlung
cities Bundesstaat, __name__ Sammlung
cities Land, Bevölkerung, __name__ Sammlung

Wenn Sie Ergebnisse nach der nicht standardmäßigen __name__-Richtung sortieren möchten, müssen Sie diesen Index erstellen.

Perfekter Index

Der perfekte Index für eine Abfrage, der die effizienteste Ausführung der Abfrage ermöglicht, wird nach den folgenden Eigenschaften in der angegebenen Reihenfolge definiert:

  1. In Gleichheitsfiltern verwendete Felder
  2. In Sortierfolgen verwendete Felder
  3. Felder in Bereichs- und Ungleichheitsfiltern, die nicht bereits in Sortierfolgen enthalten sind
  4. In Aggregationen verwendete Felder, die nicht bereits in Sortierfolgen sowie Bereichs- und Ungleichheitsfiltern enthalten sind

Firestore berechnet die Ergebnisse für Abfragen so:

  1. Gibt den Index an, der der Sammlung, den Filtereigenschaften, Filteroperatoren und Sortierfolgen der Abfrage entspricht
  2. Gibt die Indexposition zum Starten des Scanvorgangs an, bei der die Gleichheitsfilter sowie Bereichs- und Ungleichheitsfilter der Abfrage für die erste Reihenfolge nach Feld verwendet werden
  3. Startet das Scannen des Index und gibt jedes Dokument zurück, das alle Filter erfüllt, bis:
    1. auf ein Dokument stößt, das die Filterbedingungen nicht erfüllt, und bestätigt, dass nachfolgendes Dokument die Filterbedingungen nie vollständig erfüllen wird, oder
    2. das Index-Ende erreicht ist, oder
    3. die maximale Anzahl von Ergebnissen, die von der Abfrage angefordert wurden, erreicht ist.

Indexierungsbeispiel

Durch das automatische Erstellen von Einzelfeldindexen bietet Firestore eine schnelle Unterstützung grundlegender Datenbankabfragen für Ihre Anwendung. Mithilfe von Einzelfeldindexen können Sie einfache Abfragen ausführen, die auf Feldwerten sowie auf den Vergleichsoperatoren <, <=, ==, >=, > und in beruhen. Für Arrayfelder ermöglichen sie die Ausführung von array-contains- und array-contains-any-Abfragen.

Betrachten Sie zur Veranschaulichung die folgenden Beispiele aus der Sicht der Indexerstellung. Mit dem folgenden Snippet werden einige city-Dokumente in einer cities-Sammlung erstellt und für jedes Dokument die Felder name, state, country, capital, population und tags festgelegt:

Web
var citiesRef = db.collection("cities");

citiesRef.doc("SF").set({
    name: "San Francisco", state: "CA", country: "USA",
    capital: false, population: 860000,
    regions: ["west_coast", "norcal"] });
citiesRef.doc("LA").set({
    name: "Los Angeles", state: "CA", country: "USA",
    capital: false, population: 3900000,
    regions: ["west_coast", "socal"] });
citiesRef.doc("DC").set({
    name: "Washington, D.C.", state: null, country: "USA",
    capital: true, population: 680000,
    regions: ["east_coast"] });
citiesRef.doc("TOK").set({
    name: "Tokyo", state: null, country: "Japan",
    capital: true, population: 9000000,
    regions: ["kanto", "honshu"] });
citiesRef.doc("BJ").set({
    name: "Beijing", state: null, country: "China",
    capital: true, population: 21500000,
    regions: ["jingjinji", "hebei"] });

Wenn für die automatische Indexierung die Standardeinstellungen gelten, aktualisiert Firestore einen aufsteigenden Einzelfeldindex pro Nicht-Arrayfeld, einen absteigenden Einzelfeldindex pro Nicht-Arrayfeld sowie einen "Array-contains"-Einzelfeldindex für das Arrayfeld. Jede Zeile in der folgenden Tabelle steht für einen Eintrag in einem Einzelfeldindex:

Sammlung Indexiertes Feld Abfragebereich
cities name Sammlung
cities state Sammlung
cities country Sammlung
cities capital Sammlung
cities population Sammlung
cities name Sammlung
cities state Sammlung
cities country Sammlung
cities capital Sammlung
cities population Sammlung
cities array-contains Regionen Sammlung

Von Einzelfeldindexen unterstützte Abfragen

Mit diesen automatisch erstellten Einzelfeldindexen können Sie einfache Abfragen wie die folgenden ausführen:

Web
const stateQuery = citiesRef.where("state", "==", "CA");
const populationQuery = citiesRef.where("population", "<", 100000);
const nameQuery = citiesRef.where("name", ">=", "San Francisco");

Sie können auch in- und kumulierende Gleichheitsabfragen erstellen {==}:

Web
citiesRef.where('country', 'in', ["USA", "Japan", "China"])

// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
         .where("capital", "==", false)
         .where("state", "==", "CA")
         .where("population", "==", 860000)

Wenn Sie ein kumulierende Abfrage ausführen müssen, die einen Bereichsvergleich (<, <=, > oder >=) verwendet, oder wenn Sie nach einem anderen Feld sortieren müssen, ist es erforderlich, für diese Abfrage einen zusammengesetzten Index zu erstellen.

Mit dem array-contains-Index können Sie das Arrayfeld regions abfragen:

Web
citiesRef.where("regions", "array-contains", "west_coast")
// array-contains-any and array-contains use the same indexes
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])

Von zusammengesetzten Indexen unterstützte Abfragen

Firestore verwendet zusammengesetzte Indexe für kumulierende Abfragen, die noch nicht von Einzelfeldindexen unterstützt werden. Einen zusammengesetzten Index benötigen Sie beispielsweise für die folgenden Abfragen:

Web
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)

Für diese Abfragen ist der unten stehende zusammengesetzte Index erforderlich. Da die Abfrage für das Feld country einen Gleichheitsoperator (== oder in) verwendet, können Sie für dieses Feld den aufsteigenden oder absteigenden Indexmodus verwenden. Standardmäßig wird bei Ungleichheitsklauseln eine aufsteigende Sortierreihenfolge angewendet, die auf dem Feld in der Ungleichheitsklausel basiert.

Sammlung Indexierte Felder Abfragebereich
cities (oder ) country, population Sammlung

Um dieselben Abfragen mit absteigender Sortierreihenfolge auszuführen, benötigen Sie für population einen zusätzlichen zusammengesetzten Index in absteigender Reihenfolge:

Web
citiesRef.where("country", "==", "USA").orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", "<", 3800000)
         .orderBy("population", "desc")

citiesRef.where("country", "==", "USA")
         .where("population", ">", 690000)
         .orderBy("population", "desc")

citiesRef.where("country", "in", ["USA", "Japan", "China"])
         .where("population", ">", 690000)
         .orderBy("population", "desc")
Sammlung Indexierte Felder Abfragebereich
cities country, population Sammlung
cities country, population Sammlung

Außerdem müssen Sie einen zusammengesetzten Index erstellen, um eine array-contains- oder array-contains-any-Abfrage mit zusätzlichen Klauseln zu kombinieren.

Web
citiesRef.where("regions", "array-contains", "east_coast")
         .where("capital", "==", true)

// array-contains-any and array-contains use the same index
citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
         .where("capital", "==", true)
Sammlung Indexierte Felder Abfragebereich
cities array-contains tags, (oder ) capital Sammlung

Von Sammlungsgruppenindexen unterstützte Abfragen

Um einen Index mit Sammlungsgruppenbereich zu verstehen, stellen Sie sich vor, Sie fügen einigen der city-Dokumente eine landmarks-Untersammlung hinzu:

Web
var citiesRef = db.collection("cities");

citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Bridge",
    category : "bridge" });
citiesRef.doc("SF").collection("landmarks").doc().set({
    name: "Golden Gate Park",
    category : "park" });

citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Gallery of Art",
    category : "museum" });
citiesRef.doc("DC").collection("landmarks").doc().set({
    name: "National Mall",
    category : "park" });

Mithilfe des folgenden Einzelfeldindex mit Sammlungsbereich können Sie die landmarks-Sammlung einer einzelnen Stadt basierend auf dem Feld category abfragen:

Sammlung Indexierte Felder Abfragebereich
landmarks (oder ) category Sammlung
Web
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])

Angenommen, Sie möchten die Sehenswürdigkeiten in allen Städten abfragen. Um diese Abfrage für die Sammlungsgruppe auszuführen, die alle landmarks-Sammlungen umfasst, müssen Sie einen landmarks-Einzelfeldindex mit Sammlungsgruppenbereich aktivieren:

Sammlung Indexierte Felder Abfragebereich
landmarks (oder ) category Sammlungsgruppe

Wenn dieser Index aktiviert ist, können Sie die landmarks-Sammlungsgruppe abfragen:

Web
var landmarksGroupRef = db.collectionGroup("landmarks");

landmarksGroupRef.where("category", "==", "park")
landmarksGroupRef.where("category", "in", ["park", "museum"])

Wenn Sie eine Sammlungsgruppenabfrage ausführen möchten, die gefilterte oder geordnete Ergebnisse zurückgibt, müssen Sie einen entsprechenden Einzelfeldindex oder zusammengesetzten Index mit Sammlungsgruppenbereich aktivieren. Sammlungsgruppenabfragen, die keine Ergebnisse filtern oder ordnen, erfordern jedoch keine zusätzlichen Indexdefinitionen.

Sie können beispielsweise die folgende Sammlungsgruppenabfrage ausführen, ohne einen zusätzlichen Index zu aktivieren:

Web
db.collectionGroup("landmarks").get()

Indexeinträge

Die Anzahl der Indexeinträge für ein Dokument wird durch die konfigurierten Indexe Ihres Projekts und die Struktur eines Dokuments bestimmt. Indexeinträge werden auf das Limit der Indexeinträge angerechnet.

Im folgenden Beispiel werden die Indexeinträge eines Dokuments veranschaulicht.

Dokument

/cities/SF

city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]

Einzelfeldindexe

  • city_name ASC
  • city_name DESC
  • Temperatur.Sommer ASC
  • Temperatur.Sommer DESC
  • Temperatur.winter ASC
  • Temperatur.winter DESC
  • Stadtteile Array enthält (ASC und DESC)

Zusammengesetzte Indexe

  • city_name ASC, Stadtteile ARRAY
  • city_name DESC, Stadtteile ARRAY

Indexeinträge

Diese Indexierungskonfiguration führt zu den folgenden 18 Indexeinträgen für das Dokument:

Index Indexierte Daten
Einzelfeld-Indexeinträge
city_name ASC city_name: „Hamburg“
city_name DESC city_name: „Hamburg“
Temperatur.Sommer ASC Temperatur.Sommer: 67
Temperatur.Sommer DESC Temperatur.Sommer: 67
Temperatur.winter ASC Temperatur.Winter: 55
Temperatur.winter DESC Temperatur.Winter: 55
Viertel enthält ASC Stadtviertel: "Mission"
Stadtviertel Array enthält DESC Stadtviertel: "Mission"
Viertel enthält ASC Stadtviertel: "Downtown"
Stadtviertel Array enthält DESC Stadtviertel: "Downtown"
Viertel enthält ASC Stadtviertel: "Marina"
Stadtviertel Array enthält DESC Stadtviertel: "Marina"
Zusammengesetzte Indexeinträge
city_name ASC, Stadtteile ARRAY city_name: "San Francisco", Stadtteile: "Mission"
city_name ASC, Stadtteile ARRAY city_name: "San Francisco", Stadtteile: "Downtown"
city_name ASC, Stadtteile ARRAY city_name: "San Francisco", Stadtteile: "Marina"
city_name DESC, Stadtteile ARRAY city_name: "San Francisco", Stadtteile: "Mission"
city_name DESC, Stadtteile ARRAY city_name: "San Francisco", Stadtteile: "Downtown"
city_name DESC, Stadtteile ARRAY city_name: "San Francisco", Stadtteile: "Marina"

Indexe und Preise

Indexe tragen zu den Speicherkosten Ihrer Anwendung bei. Weitere Informationen zur Berechnung der Speichergröße für Indexe finden Sie unter Größe des Indexeintrags.

Vorteile der Indexzusammenführung

Auch wenn Firestore für jede Abfrage einen Index verwendet, ist nicht immer ein Index pro Abfrage erforderlich. Bei Abfragen mit mehreren Gleichheitsklauseln (==) und optional einer orderBy-Klausel kann Firestore vorhandene Indexe wiederverwenden. Mit Firestore besteht die Möglichkeit, die Indexe für einfache Gleichheitsfilter zusammenzuführen und auf diese Weise die zusammengesetzten Indexe zu erstellen, die für umfangreichere Gleichheitsabfragen benötigt werden.

Sie können die Indexierungskosten reduzieren, wenn Sie prüfen, welche Situationen sich für die Indexzusammenführung eignen. Stellen Sie sich beispielsweise eine Sammlung restaurants für eine Anwendung zur Restaurantbewertung vor:

  • restaurants

    • burgerthyme

      name : "Burger Thyme"
      category : "burgers"
      city : "San Francisco"
      editors_pick : true
      star_rating : 4

Angenommen, diese Anwendung verwendet Abfragen wie die unten stehenden. Beachten Sie, dass die Anwendung Kombinationen aus Gleichheitsklauseln für category, city und editors_pick verwendet und dabei immer aufsteigend nach star_rating sortiert:

Web
db.collection("restaurants").where("category", "==", "burgers")
                            .orderBy("star_rating")

db.collection("restaurants").where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==", "San Francisco")
                            .orderBy("star_rating")

db.collection("restaurants").where("category", "==", "burgers")
                            .where("city", "==" "San Francisco")
                            .where("editors_pick", "==", true )
                            .orderBy("star_rating")

Sie können für jede Abfrage einen Index erstellen:

Sammlung Indexierte Felder Abfragebereich
restaurants category, star_rating Sammlung
restaurants city, star_rating Sammlung
restaurants category, city, star_rating Sammlung
restaurants category, city, editors_pick, star_rating Sammlung

Als bessere Lösung können Sie die Anzahl der Indexe reduzieren und dafür die Möglichkeit von Firestore nutzen, Indexe für Gleichheitsklauseln zusammenzuführen:

Sammlung Indexierte Felder Abfragebereich
restaurants category, star_rating Sammlung
restaurants city, star_rating Sammlung
restaurants editors_pick, star_rating Sammlung

Dieser Indexsatz ist nicht nur kleiner, sondern unterstützt auch eine zusätzliche Abfrage:

Web
db.collection("restaurants").where("editors_pick", "==", true)
                            .orderBy("star_rating")

Limits für die Indexierung

Die folgenden Limits gelten für Indexe. Informationen zu allen Kontingenten und Limits finden Sie unter Kontingente und Limits.

Auf dieser Seite sind die Anfragekontingente und -limits für Firestore aufgeführt.

Limit Details
Maximale Anzahl zusammengesetzter Indexe für eine Datenbank
Maximale Anzahl von Einzelfeldkonfigurationen für eine Datenbank
  • 200 ein, wenn Sie die Abrechnung für Ihr Google Cloud-Projekt nicht aktiviert haben.

    Wenn Sie ein größeres Kontingent benötigen, müssen Sie die Abrechnung für Ihr Google Cloud-Projekt aktivieren.

  • 500, wenn Sie die Abrechnung für Ihr Google Cloud-Projekt aktivieren.

Eine Konfiguration auf Feldebene kann mehrere Konfigurationen für dasselbe Feld enthalten. Beispielsweise zählen eine Einzelfeldindexierungsausnahme und eine TTL-Richtlinie für dasselbe Feld als eine Feldkonfiguration auf das Limit.

Maximale Anzahl Indexeinträge für jedes Dokument

40.000

Die Anzahl der Indexeinträge ist die Summe von Folgendem für ein Dokument:

  • Anzahl der Einzelfeld-Indexeinträge
  • Anzahl zusammengesetzter Indexeinträge

Informationen darüber, wie Firestore ein Dokument und einen Indexsatz in Indexeinträge umwandelt, finden Sie in diesem Beispiel für das Zählen von Indexeinträgen.

Maximale Anzahl von Feldern in einem zusammengesetzten Index 100
Maximale Größe eines Indexeintrags

7,5 KB

Informationen darüber, wie Firestore die Größe von Indexeinträgen berechnet, erhalten Sie unter Größe des Indexeintrags.

Maximale Summe der Größen der Indexeinträge eines Dokuments

8 MiB

Die Gesamtgröße ist die Summe von Folgendem für ein Dokument:

  • Summe der Größen der Einzelfeld-Indexeinträge eines Dokuments
  • Summe der Größen der zusammengesetzten Indexeinträge eines Dokuments
  • Maximale Größe des Werts eines indexierten Felds

    1.500 Byte

    Feldwerte über 1.500 Byte werden abgeschnitten. Abfragen unter Beteiligung von abgeschnittenen Feldwerten können inkonsistente Ergebnisse zurückgeben.

    Best Practices zur Indexierung

    Bei den meisten Anwendungen sind die automatische Indexierung sowie Fehlermeldungslinks zur Verwaltung der Indexe ausreichend. In den folgenden Fällen können Sie aber Ausnahmen für einzelne Felder hinzufügen:

    Case Beschreibung
    Große Stringfelder

    Wenn Sie ein Stringfeld haben, das oft lange Stringwerte enthält, die Sie nicht für Abfragen verwenden, können Sie die Speicherkosten senken, indem Sie das Feld von der Indexierung ausnehmen.

    Hohe Schreibraten für eine Sammlung, die Dokumente mit aufeinanderfolgenden Werten enthält

    Wenn Sie ein Feld indexieren, dessen Werte über die Dokumente einer Sammlung hinweg kontinuierlich zu- oder abnehmen, z. B. im Fall eines Zeitstempels, beträgt die maximale Schreibrate für die Sammlung 500 Schreibvorgänge pro Sekunde. Wenn Sie keine Abfrage basierend auf dem Feld mit aufeinanderfolgenden Werten durchführen, können Sie das Feld von der Indexierung ausnehmen, um dieses Limit zu umgehen.

    In einem IoT-Anwendungsfall mit einer hohen Schreibrate kann sich beispielsweise eine Sammlung, die Dokumente mit einem Zeitstempelfeld enthält, dem Limit von 500 Schreibvorgängen pro Sekunde nähern.

    TTL-Felder

    Wenn Sie TTL-Richtlinien (Time-to-Live) verwenden, muss das Feld „TTL“ einen Zeitstempel enthalten. Die Indexierung für TTL-Felder ist standardmäßig aktiviert und kann die Leistung bei höheren Traffic-Raten beeinträchtigen. Fügen Sie als Best Practice Einzelfeldausnahmen für Ihre TTL-Felder hinzu.

    Große Array- oder Map-Felder

    Große Array- oder Kartenfelder können sich dem Limit von 40.000 Indexeinträgen pro Dokument nähern. Wenn Sie keine Abfragen basierend auf einem großen Array- oder Kartenfeld durchführen, sollten Sie dieses von der Indexierung ausnehmen.

    Wenn Sie Abfragen mit Bereichs- und Ungleichheitsoperatoren für mehrere Felder verwenden, lesen Sie die Überlegungen zur Indexierung, die Sie zur Optimierung der Leistung und Kosten von Firestore-Abfragen berücksichtigen sollten.

    Weitere Informationen zum Beheben von Indexierungsproblemen (Index-Fanout, INVALID_ARGUMENT-Fehler) finden Sie auf der Seite zur Fehlerbehebung.