Indizes sind ein wichtiger Faktor für die Leistung einer Datenbank. Ähnlich wie der Index eines Buches, der Themen in einem Buch den Seitenzahlen zuordnet, ordnet ein Datenbankindex die Elemente in einer Datenbank ihren Positionen in der Datenbank zu. Wenn Sie einer Datenbank eine Abfrage senden, kann die Datenbank mithilfe eines Indexes schnell nach den Standorten der von Ihnen angeforderten Elemente suchen.
Auf dieser Seite werden die beiden Arten von Indizes beschrieben, die Cloud Firestore verwendet: Einzelfeldindizes und zusammengesetzte Indizes .
Ein Index hinter jeder Abfrage
Wenn für eine Abfrage kein Index vorhanden ist, durchsuchen die meisten Datenbanken ihren Inhalt Element für Element, ein langsamer Prozess, der mit zunehmender Datenbankgröße noch langsamer wird. Cloud Firestore garantiert eine hohe Abfrageleistung durch die Verwendung von Indizes für alle Abfragen. Daher hängt die Abfrageleistung von der Größe des Ergebnissatzes und nicht von der Anzahl der Elemente in der Datenbank ab.
Weniger Indexverwaltung, mehr App-Entwicklung
Cloud Firestore umfasst Funktionen, die den Zeitaufwand für die Verwaltung von Indizes reduzieren. Die für die grundlegendsten Abfragen erforderlichen Indizes werden automatisch für Sie erstellt. Während Sie Ihre App verwenden und testen, hilft Ihnen Cloud Firestore dabei , zusätzliche Indizes zu identifizieren und zu erstellen, die Ihre App benötigt.
Indextypen
Cloud Firestore verwendet zwei Arten von Indizes: Einzelfeld- und zusammengesetzte Indizes. Neben der Anzahl der indizierten Felder unterscheiden sich Einzelfeld- und zusammengesetzte Indizes auch in der Art und Weise, wie Sie sie verwalten.
Einzelfeldindizes
Ein Einzelfeldindex speichert eine sortierte Zuordnung aller Dokumente in einer Sammlung, die ein bestimmtes Feld enthalten. Jeder Eintrag in einem Einzelfeldindex zeichnet den Wert eines Dokuments für ein bestimmtes Feld und den Speicherort des Dokuments in der Datenbank auf. Cloud Firestore verwendet diese Indizes, um viele grundlegende Abfragen durchzuführen. Sie verwalten Einzelfeldindizes, indem Sie die automatischen Indexierungseinstellungen und Indexausnahmen Ihrer Datenbank konfigurieren.
Automatische Indizierung
Standardmäßig verwaltet Cloud Firestore automatisch Einzelfeldindizes für jedes Feld in einem Dokument und jedes Unterfeld in einer Karte. Cloud Firestore verwendet die folgenden Standardeinstellungen für Einzelfeldindizes:
Für jedes Nicht-Array- und Nicht-Zuordnungsfeld definiert Cloud Firestore zwei Einzelfeldindizes für den Sammlungsbereich , einen im aufsteigenden Modus und einen im absteigenden Modus.
Für jedes Kartenfeld erstellt Cloud Firestore Folgendes:
- Ein aufsteigender Index im Sammlungsbereich für jedes Nicht-Array- und Nicht-Map-Unterfeld.
- Ein absteigender Index im Sammlungsbereich für jedes Nicht-Array- und Nicht-Zuordnungs-Unterfeld.
- Ein Array im Sammlungsbereich enthält einen Index für jedes Array-Unterfeld.
- Cloud Firestore indiziert jedes Kartenunterfeld rekursiv.
Für jedes Array-Feld in einem Dokument erstellt und verwaltet Cloud Firestore einen Array-Contains-Index im Sammlungsbereich.
Einzelfeldindizes mit Sammlungsgruppenbereich werden standardmäßig nicht verwaltet.
Ausnahmen für Einzelfeldindizes
Sie können ein Feld von Ihren automatischen Indexierungseinstellungen ausnehmen, indem Sie eine Ausnahme für den Einzelfeldindex erstellen. Eine Ausnahme von der Indizierung setzt die datenbankweiten automatischen Indexeinstellungen außer Kraft. Eine Ausnahme kann einen Einzelfeldindex aktivieren, den Ihre Einstellungen für die automatische Indizierung andernfalls deaktivieren würden, oder einen Einzelfeldindex deaktivieren, den die automatische Indizierung andernfalls aktivieren würde. Informationen zu Fällen, in denen Ausnahmen nützlich sein können, finden Sie in den Best Practices für die Indizierung .
Verwenden Sie den Feldpfadwert *
, um Indexausnahmen auf Sammlungsebene für alle Felder in einer Sammlungsgruppe hinzuzufügen. Legen Sie beispielsweise für comments
den Feldpfad auf *
fest, um mit allen Feldern in der comments
übereinzustimmen, und deaktivieren Sie die Indizierung aller Felder unter der Sammlungsgruppe. Anschließend können Sie Ausnahmen hinzufügen, um nur die für Ihre Abfragen erforderlichen Felder zu indizieren. Durch die Reduzierung der Anzahl indizierter Felder werden die Speicherkosten gesenkt und die Schreibleistung verbessert.
Wenn Sie für ein Kartenfeld eine Einzelfeldindexausnahme erstellen, erben die Unterfelder der Karte diese Einstellungen. Sie können jedoch Ausnahmen für Einzelfeldindizes für bestimmte Unterfelder definieren. Wenn Sie eine Ausnahme für ein Unterfeld löschen, erbt das Unterfeld die Ausnahmeeinstellungen seines übergeordneten Felds, sofern vorhanden, oder die datenbankweiten Einstellungen, wenn keine übergeordneten Ausnahmen vorhanden sind.
Informationen zum Erstellen und Verwalten von Ausnahmen für Einzelfeldindizes finden Sie unter Verwalten von Indizes in Cloud Firestore .
Zusammengesetzte Indizes
Ein zusammengesetzter Index speichert eine sortierte Zuordnung aller Dokumente in einer Sammlung, basierend auf einer geordneten Liste der zu indizierenden Felder.
Cloud Firestore verwendet zusammengesetzte Indizes, um Abfragen zu unterstützen, die nicht bereits von Einzelfeldindizes unterstützt werden.
Cloud Firestore erstellt aufgrund der großen Anzahl möglicher Feldkombinationen nicht automatisch zusammengesetzte Indizes wie Einzelfeldindizes. Stattdessen hilft Ihnen Cloud Firestore beim Erstellen Ihrer App , erforderliche zusammengesetzte Indizes zu identifizieren und zu erstellen .
Wenn Sie die obige Abfrage versuchen, ohne zuvor den erforderlichen Index zu erstellen, gibt Cloud Firestore eine Fehlermeldung mit einem Link zurück, dem Sie folgen können, um den fehlenden Index zu erstellen. Dies geschieht jedes Mal, wenn Sie eine Abfrage versuchen, die nicht von einem Index unterstützt wird. Sie können zusammengesetzte Indizes auch manuell definieren und verwalten, indem Sie die Konsole oder die Firebase-CLI verwenden. Weitere Informationen zum Erstellen und Verwalten zusammengesetzter Indizes finden Sie unter Verwalten von Indizes .
Indexmodi und Abfragebereiche
Sie konfigurieren Einzelfeld- und zusammengesetzte Indizes unterschiedlich, aber beide erfordern, dass Sie Indexmodi und Abfragebereiche für Ihre Indizes konfigurieren.
Indexmodi
Wenn Sie einen Index definieren, wählen Sie für jedes indizierte Feld einen Indexmodus aus. Der Indexmodus jedes Felds unterstützt spezifische Abfrageklauseln für dieses Feld. Sie können aus folgenden Indexmodi wählen:
Indexmodus | Beschreibung |
---|---|
Aufsteigender | Unterstützt die Abfrageklauseln < , <= , == , >= , > , != , in und not-in für das Feld und unterstützt die Sortierung der Ergebnisse in aufsteigender Reihenfolge basierend auf diesem Feldwert. |
Absteigender | Unterstützt die Abfrageklauseln < , <= , == , >= , > , != , in und not-in für das Feld und unterstützt die Sortierung der Ergebnisse in absteigender Reihenfolge basierend auf diesem Feldwert. |
Array enthält | Unterstützt die Abfrageklauseln array-contains und array-contains-any für das Feld. |
Abfragebereiche
Jeder Index ist entweder auf eine Sammlung oder eine Sammlungsgruppe beschränkt. Dies wird als Abfragebereich des Index bezeichnet:
- Sammlungsumfang
- Cloud Firestore erstellt standardmäßig Indizes mit Sammlungsbereich. Diese Indizes unterstützen Abfragen, die Ergebnisse aus einer einzelnen Sammlung zurückgeben.
- Geltungsbereich der Sammlungsgruppe
- Eine Sammlungsgruppe umfasst 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.
Standardreihenfolge und das Feld __name__
Zusätzlich zum Sortieren von Dokumenten nach den für jedes Feld angegebenen Indexmodi (aufsteigend oder absteigend) wenden Indizes eine abschließende Sortierung nach dem __name__
Feld jedes Dokuments an. Der Wert des Felds __name__
wird auf den vollständigen Dokumentpfad gesetzt. Dies bedeutet, dass Dokumente im Ergebnissatz mit denselben Feldwerten nach Dokumentpfad sortiert werden.
Standardmäßig wird das Feld __name__
in derselben Richtung sortiert wie das zuletzt sortierte Feld in der Indexdefinition. Zum Beispiel:
Sammlung | Felder indiziert | Abfragebereich |
---|---|---|
Städte | __name__ | Name, Sammlung |
Städte | __name__ | Zustand, Sammlung |
Städte | __name__ | Land, Bevölkerung, Sammlung |
Um die Ergebnisse nach der nicht standardmäßigen __name__
Richtung zu sortieren, müssen Sie diesen Index erstellen.
Beispiel für die Indizierung
Durch die automatische Erstellung von Einzelfeldindizes für Sie ermöglicht Cloud Firestore Ihrer Anwendung, die grundlegendsten Datenbankabfragen schnell zu unterstützen. Mit Einzelfeldindizes können Sie einfache Abfragen basierend auf Feldwerten und den Komparatoren <
, <=
, ==
, >=
, >
und in
durchführen. Für Array-Felder ermöglichen sie die Durchführung array-contains
und array-contains-any
Abfragen.
Betrachten Sie zur Veranschaulichung die folgenden Beispiele aus der Sicht der Indexerstellung. Der folgende Codeausschnitt erstellt einige city
in einer cities
und legt für jedes Dokument die Felder name
“, state
“, country
“, capital
“, „ population
“ und „ tags
fest:
Netz
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"] });
Unter Annahme der Standardeinstellungen für die automatische Indizierung aktualisiert Cloud Firestore einen aufsteigenden Einzelfeldindex pro Nicht-Array-Feld, einen absteigenden Einzelfeldindex pro Nicht-Array-Feld und einen Array-enthält-Einzelfeldindex für das Array-Feld. Jede Zeile in der folgenden Tabelle stellt einen Eintrag in einem Einzelfeldindex dar:
Sammlung | Feld indiziert | Abfragebereich |
---|---|---|
Städte | Name | Sammlung |
Städte | -Zustand | Sammlung |
Städte | Land | Sammlung |
Städte | Kapital | Sammlung |
Städte | Bevölkerung | Sammlung |
Städte | Name | Sammlung |
Städte | Zustand | Sammlung |
Städte | Land | Sammlung |
Städte | Kapital | Sammlung |
Städte | Bevölkerung | Sammlung |
Städte | array-contains Regionen | Sammlung |
Abfragen, die von Einzelfeldindizes unterstützt werden
Mithilfe dieser automatisch erstellten Einzelfeldindizes können Sie einfache Abfragen wie die folgenden ausführen:
Netz
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 Compound-Gleichheitsabfragen ( ==
) erstellen:
Netz
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 eine zusammengesetzte Abfrage ausführen müssen, die einen Bereichsvergleich ( <
, <=
, >
oder >=
) verwendet, oder wenn Sie nach einem anderen Feld sortieren müssen, müssen Sie einen zusammengesetzten Index für diese Abfrage erstellen.
Mit dem Index array-contains
“ können Sie das Array-Feld „ regions
abfragen:
Netz
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 Indizes unterstützte Abfragen
Cloud Firestore verwendet zusammengesetzte Indizes, um zusammengesetzte Abfragen zu unterstützen, die nicht bereits von Einzelfeldindizes unterstützt werden. Beispielsweise benötigen Sie einen zusammengesetzten Index für die folgenden Abfragen:
Netz
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 eine Gleichheit ( ==
oder in
) für das country
verwendet, können Sie für dieses Feld einen aufsteigenden oder absteigenden Indexmodus verwenden. Standardmäßig wenden Ungleichheitsklauseln eine aufsteigende Sortierreihenfolge basierend auf dem Feld in der Ungleichheitsklausel an.
Sammlung | Felder indiziert | Abfragebereich |
---|---|---|
Städte | (oder ) Land, Bevölkerung | Sammlung |
Um dieselben Abfragen, jedoch mit absteigender Sortierreihenfolge, auszuführen, benötigen Sie einen zusätzlichen zusammengesetzten Index in absteigender Richtung für die population
:
Netz
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 | Felder indiziert | Abfragebereich |
---|---|---|
Städte | Land, Bevölkerung | Sammlung |
Städte | Land , Bevölkerung | Sammlung |
Sie müssen außerdem einen zusammengesetzten Index erstellen, um eine array-contains
oder array-contains-any
Abfrage mit zusätzlichen Klauseln zu kombinieren.
Netz
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 | Felder indiziert | Abfragebereich |
---|---|---|
Städte | Array enthält Tags, | (oder ) in GroßbuchstabenSammlung |
Von Sammlungsgruppenindizes unterstützte Abfragen
Um einen Index mit Sammlungsgruppenumfang zu demonstrieren, stellen Sie sich vor, Sie fügen einigen city
eine Untersammlung landmarks
hinzu:
Netz
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" });
Mit dem folgenden Einzelfeldindex mit Sammlungsbereich können Sie die landmarks
einer einzelnen Stadt basierend auf dem category
abfragen:
Sammlung | Felder indiziert | Abfragebereich |
---|---|---|
Sehenswürdigkeiten | Kategorie | (oder “)Sammlung |
Netz
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park") citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])
Stellen Sie sich nun vor, dass Sie daran interessiert sind, die Sehenswürdigkeiten in allen Städten abzufragen. Um diese Abfrage für die Sammlungsgruppe auszuführen, die aus allen landmarks
besteht, müssen Sie einen landmarks
Einzelfeldindex mit Sammlungsgruppenbereich aktivieren:
Sammlung | Felder indiziert | Abfragebereich |
---|---|---|
Sehenswürdigkeiten | Kategorie | (oder “)Sammlungsgruppe |
Wenn dieser Index aktiviert ist, können Sie die Sammlungsgruppe der landmarks
abfragen:
Netz
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
Um eine Sammlungsgruppenabfrage auszuführen, die gefilterte oder geordnete Ergebnisse zurückgibt, müssen Sie einen entsprechenden Einzelfeld- oder zusammengesetzten Index mit Sammlungsgruppenbereich aktivieren. Sammlungsgruppenabfragen, die die Ergebnisse nicht filtern oder sortieren, erfordern jedoch keine zusätzlichen Indexdefinitionen.
Sie können beispielsweise die folgende Sammlungsgruppenabfrage ausführen, ohne einen zusätzlichen Index zu aktivieren:
Netz
db.collectionGroup("landmarks").get()
Indexeinträge
Die in Ihrem Projekt konfigurierten Indizes und die Struktur eines Dokuments bestimmen die Anzahl der Indexeinträge für ein Dokument. Indexeinträge werden auf die Anzahl der Indexeinträge angerechnet.
Das folgende Beispiel demonstriert die Indexeinträge eines Dokuments.
Dokumentieren
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Einzelfeldindizes
- Stadtname ASC
- Stadtname DESC
- Temperaturen.Sommer ASC
- Temperaturen.Sommer DESC
- Temperaturen.Winter ASC
- Temperaturen.Winter BESCHR
- Nachbarschaften Array enthält (ASC und DESC)
Zusammengesetzte Indizes
- Stadtname ASC, Nachbarschaften ARRAY
- Stadtname DESC, Nachbarschaften ARRAY
Indexeinträge
Diese Indexierungskonfiguration führt zu den folgenden 18 Indexeinträgen für das Dokument:
Index | Indizierte Daten |
---|---|
Einzelfeld-Indexeinträge | |
Stadtname ASC | Stadtname: „San Francisco“ |
Stadtname DESC | Stadtname: „San Francisco“ |
Temperaturen.Sommer ASC | Temperaturen.Sommer: 67 |
Temperaturen.Sommer DESC | Temperaturen.Sommer: 67 |
Temperaturen.Winter ASC | Temperaturen.Winter: 55 |
Temperaturen.Winter BESCHR | Temperaturen.Winter: 55 |
Nachbarschafts-Array Enthält ASC | Nachbarschaften: „Mission“ |
Nachbarschafts-Array Enthält DESC | Nachbarschaften: „Mission“ |
Nachbarschafts-Array Enthält ASC | Stadtteile: „Innenstadt“ |
Nachbarschafts-Array Enthält DESC | Stadtteile: „Innenstadt“ |
Nachbarschafts-Array Enthält ASC | Stadtteile: „Marina“ |
Nachbarschafts-Array Enthält DESC | Stadtteile: „Marina“ |
Zusammengesetzte Indexeinträge | |
Stadtname ASC, Nachbarschaften ARRAY | Stadtname: „San Francisco“, Nachbarschaften: „Mission“ |
Stadtname ASC, Nachbarschaften ARRAY | Stadtname: „San Francisco“, Nachbarschaften: „Downtown“ |
Stadtname ASC, Nachbarschaften ARRAY | Stadtname: „San Francisco“, Stadtteile: „Marina“ |
Stadtname DESC, Nachbarschaften ARRAY | Stadtname: „San Francisco“, Nachbarschaften: „Mission“ |
Stadtname DESC, Nachbarschaften ARRAY | Stadtname: „San Francisco“, Nachbarschaften: „Downtown“ |
Stadtname DESC, Nachbarschaften ARRAY | Stadtname: „San Francisco“, Stadtteile: „Marina“ |
Indizes und Preise
Indizes tragen zu den Speicherkosten Ihrer Anwendung bei. Weitere Informationen zur Berechnung der Speichergröße für Indizes finden Sie unter Indexeintragsgröße .
Nutzen Sie die Vorteile der Indexzusammenführung
Obwohl Cloud Firestore für jede Abfrage einen Index verwendet, ist nicht unbedingt ein Index pro Abfrage erforderlich. Für Abfragen mit mehreren Gleichheitsklauseln ( ==
) und optional einer orderBy
Klausel kann Cloud Firestore vorhandene Indizes wiederverwenden. Cloud Firestore kann die Indizes für einfache Gleichheitsfilter zusammenführen, um die zusammengesetzten Indizes zu erstellen, die für größere Gleichheitsabfragen benötigt werden.
Sie können die Indexierungskosten senken, indem Sie Situationen identifizieren, in denen Sie von der Indexzusammenführung profitieren können. Stellen Sie sich zum Beispiel eine restaurants
für eine Restaurantbewertungs-App vor:
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Stellen Sie sich nun vor, diese App verwendet Abfragen wie die folgenden. Beachten Sie, dass die App Kombinationen von Gleichheitsklauseln für category
, city
und editors_pick
verwendet und dabei immer nach aufsteigender star_rating
sortiert:
Netz
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önnten für jede Abfrage einen Index erstellen:
Sammlung | Felder indiziert | Abfragebereich |
---|---|---|
Restaurants | Kategorie | , Kategorie star_rating“.Sammlung |
Restaurants | Stadt, Star_rating | Sammlung |
Restaurants | Kategorie, -Stadt, Sterne-Bewertung | Sammlung |
Restaurants | Kategorie, Stadt, Editors_Pick, Star_rating | Sammlung |
Als bessere Lösung können Sie die Anzahl der Indizes reduzieren, indem Sie die Fähigkeit von Cloud Firestore nutzen, Indizes für Gleichheitsklauseln zusammenzuführen:
Sammlung | Felder indiziert | Abfragebereich |
---|---|---|
Restaurants | Kategorie | , Kategorie star_rating“.Sammlung |
Restaurants | Stadt, Star_rating | Sammlung |
Restaurants | editors_pick, star_rating | Sammlung |
Dieser Indexsatz ist nicht nur kleiner, er unterstützt auch eine zusätzliche Abfrage:
Netz
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
Indizierungsgrenzen
Für Indizes gelten die folgenden Grenzwerte. Alle Kontingente und Limits finden Sie unter Kontingente und Limits .
Grenze | Einzelheiten |
---|---|
Maximale Anzahl zusammengesetzter Indizes für eine Datenbank |
|
Maximale Anzahl von Einzelfeldkonfigurationen für eine Datenbank |
Eine Konfiguration auf Feldebene kann mehrere Konfigurationen für dasselbe Feld enthalten. Beispielsweise zählen eine Ausnahme von der Einzelfeldindizierung und eine TTL-Richtlinie für dasselbe Feld als eine Feldkonfiguration für den Grenzwert. |
Maximale Anzahl von Indexeinträgen für jedes Dokument | 40.000 Die Anzahl der Indexeinträge ist die Summe der folgenden Werte für ein Dokument:
Um zu sehen, wie Cloud Firestore ein Dokument und eine Reihe von Indizes in Indexeinträge umwandelt, sehen Sie sich dieses Beispiel für die Anzahl der Indexeinträge an. |
Maximale Anzahl von Feldern in einem zusammengesetzten Index | 100 |
Maximale Größe eines Indexeintrags | 7,5 KiB Informationen dazu, wie Cloud Firestore die Indexeintragsgröße berechnet, finden Sie unter Indexeintragsgröße . |
Maximale Summe der Größen der Indexeinträge eines Dokuments | 8 MiB Die Gesamtgröße ist die Summe der folgenden Werte für ein Dokument: |
Maximale Größe eines indizierten Feldwerts | 1500 Byte Feldwerte über 1500 Byte werden abgeschnitten. Abfragen mit abgeschnittenen Feldwerten können inkonsistente Ergebnisse liefern. |
Best Practices für die Indizierung
Bei den meisten Apps können Sie sich bei der Verwaltung Ihrer Indizes auf die automatische Indizierung und die Fehlermeldungslinks verlassen. In den folgenden Fällen möchten Sie jedoch möglicherweise Ausnahmen für einzelne Felder hinzufügen:
Fall | Beschreibung |
---|---|
Große Stringfelder | Wenn Sie über ein Zeichenfolgenfeld verfügen, das häufig lange Zeichenfolgenwerte enthält, die Sie nicht für Abfragen verwenden, können Sie die Speicherkosten senken, indem Sie das Feld von der Indizierung ausnehmen. |
Hohe Schreibraten für eine Sammlung, die Dokumente mit sequenziellen Werten enthält | Wenn Sie ein Feld indizieren, das zwischen Dokumenten in einer Sammlung sequentiell zunimmt oder abnimmt, z. B. einen Zeitstempel, beträgt die maximale Schreibrate für die Sammlung 500 Schreibvorgänge pro Sekunde. Wenn Sie keine Abfragen basierend auf dem Feld mit sequenziellen Werten durchführen, können Sie das Feld von der Indizierung ausnehmen, um diese Beschränkung zu umgehen. In einem IoT-Anwendungsfall mit einer hohen Schreibrate könnte sich beispielsweise eine Sammlung, die Dokumente mit einem Zeitstempelfeld enthält, der Grenze von 500 Schreibvorgängen pro Sekunde nähern. |
TTL-Felder | Wenn Sie TTL-Richtlinien (Time-to-Live) verwenden, beachten Sie, dass das TTL-Feld ein Zeitstempel sein muss. Die Indizierung von TTL-Feldern ist standardmäßig aktiviert und kann sich bei höheren Datenverkehrsraten auf die Leistung auswirken. Fügen Sie als Best Practice Einzelfeldausnahmen für Ihre TTL-Felder hinzu. |
Große Array- oder Kartenfelder | Große Array- oder Kartenfelder können die Grenze von 40.000 Indexeinträgen pro Dokument erreichen. Wenn Sie die Abfrage nicht auf Basis eines großen Arrays oder Kartenfelds durchführen, sollten Sie es von der Indizierung ausnehmen. |
Weitere Informationen zum Beheben von Indizierungsproblemen (Index-Fanout, INVALID_ARGUMENT
Fehler) finden Sie auf der Seite zur Fehlerbehebung .