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. Bei der Abfrage in einer Datenbank ist, kann sie anhand eines Index schnell die Speicherorte die von Ihnen angeforderten Elemente.
Auf dieser Seite werden die beiden von Firestore verwendeten Indextypen erläutert: Einzelfeldindexe und zusammengesetzte Indexe.
Indexdefinition und -struktur
Ein Index wird in einer Liste von Feldern eines bestimmten Dokuments definiert, wobei entsprechenden Indexmodus für jedes Feld.
Ein Index enthält einen Eintrag für jedes in der Indexdefinition genannte Feld. Die enthält der Index alle Dokumente, die die potenziellen Ergebnisse für Abfragen sind, auf den Index. Ein Dokument wird nur dann in den Index aufgenommen, wenn es einen indexierten Wert hat. für jedes im Index verwendete Feld festgelegt. Wenn die Indexdefinition auf ein Feld verweist, für die das Dokument keinen Wert hat, wird es nicht im Index angezeigt. In diesem Fall wird das Dokument niemals als Ergebnis für eine auf dem Index basierende Abfrage zurückgegeben.
Der zusammengesetzte Index wird nach Feldwerten in der im Feld Indexdefinition.
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 Sie den Zeitaufwand für die Sie in die Indexverwaltung investieren müssen. Die für die einfachste Methode erforderlichen Indexe werden automatisch für Sie erstellt. Wenn Sie Ihre App verwenden und testen, Firestore hilft Ihnen, Erstellen Sie zusätzliche Indexe, die Ihre Anwendung benötigt.
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 Zuordnungsfeld erstellt Firestore Folgendes:
- Ein aufsteigender Index des Sammlungsbereichs für jedes Unterfeld, das kein Array und keine Karte ist.
- Ein absteigender Index des Sammlungsbereichs für jedes Teilfeld, das kein Array und keine Karte ist.
- Ein Array-Enthält-Index des Sammlungsbereichs für jedes Array-Unterfeld.
- Firestore indexiert jedes Kartenunterfeld 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 Pfadwert des Feldes *
, um für alle Indexausnahmen auf Sammlungsebene hinzuzufügen
in einer Sammlungsgruppe. Beispiel: Legen Sie für die Sammlungsgruppe comments
Folgendes fest:
den Feldpfad zu *
, damit alle Felder in der Sammlungsgruppe comments
übereinstimmen, und
Indexierung aller Felder in der Sammlungsgruppe deaktivieren Anschließend können Sie
Ausnahmen, um nur die Felder zu indexieren, die für Ihre Abfragen erforderlich sind. Das Reduzieren der
Anzahl der indexierten Felder reduziert die Speicherkosten und kann den Schreibvorgang verbessern
die Leistung.
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 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.
Firestore erstellt ähnliche zusammengesetzte Indexe nicht automatisch ist bei Einzelfeldindexen möglich, da die Anzahl der möglichen Kombinationen. Stattdessen bietet Firestore eine Unterstützung für das Ermitteln und Erstellen der erforderlichen zusammengesetzte Indexe, wenn Sie Ihre Anwendung entwickeln.
Jedes Mal, wenn Sie eine Abfrage ausführen, die von einem Index nicht unterstützt wird, gibt eine Fehlermeldung mit einem Link zurück, dem Sie folgen können, um das fehlende -Index.
Sie können zusammengesetzte Indexe auch manuell definieren oder verwalten, indem Sie die Console oder Firebase CLI verwenden. Weitere Informationen zum Erstellen und Verwalten zusammengesetzte Indexe verwalten, 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 von Dokumenten nach den Indexmodi
angegeben wird (aufsteigend oder absteigend) , wenden Indizes ein letztes
Sie werden nach dem Feld __name__
jedes Dokuments sortiert. Der Wert von __name__
ist auf den vollständigen Dokumentpfad festgelegt. Das bedeutet, dass Dokumente
mit denselben Feldwerten nach Dokumentpfad sortiert werden.
Standardmäßig wird das Feld __name__
in die gleiche Richtung wie das letzte Feld
sortierten Feld in der Indexdefinition. Beispiel:
Sammlung | Indexierte Felder | Abfragebereich |
---|---|---|
cities | Name von __name__ |
, Sammlung |
cities | __name__ |
Bundesstaat, Sammlung |
cities | __name__ |
Land, Bevölkerung, Sammlung |
Um Ergebnisse nach der nicht standardmäßigen __name__
-Richtung zu sortieren, müssen Sie
um diesen Index zu erstellen.
Indexattribute
Ein Index, mit dem die Abfrage am effizientesten ausgeführt werden kann, wird durch die folgenden Eigenschaften definiert:
- In Gleichheitsfiltern verwendete Felder
- In Sortierreihenfolgen verwendete Felder
- Felder, die in Bereichs- und Ungleichheitsfiltern verwendet werden (die noch nicht in Sortierfolgen enthalten sind)
- In Aggregationen verwendete Felder (die noch nicht in Sortierfolgen, Bereichs- und Ungleichheitsfiltern enthalten sind)
Firestore berechnet die Ergebnisse für Abfragen so:
- Gibt den Index an, der der Sammlung, den Filtereigenschaften, den Filteroperatoren und der Sortierreihenfolge der Abfrage entspricht.
- Gibt die Indexposition an, von der aus der Scanvorgang beginnt. Der Startposition sind die Gleichheitsfilter der Abfrage vorangestellt und sie endet mit den Bereichs- und Ungleichheitsfiltern im ersten
orderBy
-Feld. - Startet das Scannen des Index und gibt jedes Dokument zurück, das alle Filter erfüllt, bis der Scanvorgang einen der folgenden Schritte ausführt:
<ph type="x-smartling-placeholder">
- </ph>
- Findet ein Dokument, das die Filterbedingungen nicht erfüllt, und bestätigt, dass jedes nachfolgende Dokument die Filterbedingungen nicht vollständig erfüllt.
- Das Indexende wird erreicht.
- Erfasst die maximale Anzahl von Ergebnissen, die von der Abfrage angefordert werden.
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 |
Um Leistungseinbußen durch die Indexzusammenführung zu vermeiden, sollten Sie
Einen zusammengesetzten Index zum Kombinieren einer array-contains
- oder array-contains-any
-Abfrage
mit zusätzlichen Klauseln:
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 ) capitalSammlung |
Von Sammlungsgruppenindexen unterstützte Abfragen
Um einen Index mit Sammlungsgruppenbereich zu demonstrieren, fügen Sie einen
landmarks
-Untersammlung zu einigen der city
-Dokumente:
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"])
Wenn Sie beispielsweise die Orientierungspunkte in allen Städten abfragen möchten,
Sie führen diese Abfrage für die Sammlungsgruppe aus, die aus allen landmarks
-
Sammlungen. Außerdem müssen Sie einen landmarks
-Einzelfeldindex mit
Umfang der Sammlungsgruppe:
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 konfigurierten Indexe Ihres Projekts und die Struktur eines Dokuments bestimmen Die Anzahl der Indexeinträge für ein Dokument. Indexeinträge werden gezählt Limit für Indexeinträge
Das folgende Beispiel zeigt die Indexeinträge eines Dokuments.
Dokument
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Einzelfeldindexe
- city_name ASC
- city_name DESC
- Temperaturen.Sommer ASC
- Temperatur.Sommer DESC
- Temperaturen.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 folgenden Indexeinträgen für den Dokument:
Index | Indexierte Daten |
---|---|
Einzelfeld-Indexeinträge | |
city_name ASC | city_name: "San Francisco" |
city_name DESC | city_name: "San Francisco" |
Temperaturen.Sommer ASC | Temperatur.Sommer: 67 |
Temperatur.Sommer DESC | Temperatur.Sommer: 67 |
Temperaturen.Winter ASC | Temperatur.Winter: 55 |
Temperatur.Winter DESC | Temperatur.Winter: 55 |
Stadtteile-Array enthält ASC | Stadtviertel: "Mission" |
Stadtteile-Array enthält DESC | Stadtviertel: "Mission" |
Stadtteile-Array enthält ASC | Stadtviertel: "Downtown" |
Stadtteile-Array enthält DESC | Stadtviertel: "Downtown" |
Stadtteile-Array enthält ASC | Stadtviertel: "Marina" |
Stadtteile-Array enthält DESC | Stadtviertel: "Marina" |
Zusammengesetzte Indexeinträge | |
city_name ASC, Stadtteile ARRAY | city_name: "San Francisco", Stadtviertel: "Mission" |
city_name ASC, Stadtteile ARRAY | city_name: "San Francisco", Stadtviertel: "Downtown" |
city_name ASC, Stadtteile ARRAY | city_name: "San Francisco", Stadtviertel: "Marina" |
city_name DESC, Stadtteile ARRAY | city_name: "San Francisco", Stadtviertel: "Mission" |
city_name DESC, Stadtteile ARRAY | city_name: "San Francisco", Stadtviertel: "Downtown" |
city_name DESC, Stadtteile ARRAY | city_name: "San Francisco", Stadtviertel: "Marina" |
Indexe und Preise
Indexe tragen zu den Speicherkosten Ihrer Anwendung bei. Weitere Informationen zum Berechnen der Speichergröße für Indexe finden Sie unter Größe des Indexeintrags.
Indexzusammenführung verwenden
Firestore verwendet zwar einen Index für jede Abfrage,
ist 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 senken, indem Sie Situationen ermitteln, in denen Sie Index verwenden können.
Zusammenführen. In einer restaurants
-Sammlung für eine App zur Restaurantbewertung beispielsweise:
restaurants
burgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Diese App verwendet Abfragen wie die folgenden. Die App verwendet Kombinationen von Gleichheitszeichen,
für category
, city
und editors_pick
verwenden und dabei immer nach
aufsteigend star_rating
:
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. Weitere Informationen zu Kontingenten und Limits finden Sie unter Kontingente und Limits:
Auf dieser Seite werden die Anfragekontingente und -limits für Firestore beschrieben.
Limit | Details |
---|---|
Maximale Anzahl zusammengesetzter Indexe für eine Datenbank |
|
Maximale Anzahl Einzelfeldkonfigurationen für eine Datenbank |
Konfiguration auf Feldebene kann mehrere Konfigurationen für dasselbe Feld enthalten. Beispiel: eine Ausnahme für die Einzelfeldindexierung und eine TTL-Richtlinie für dasselbe Feld wird als eine Feldkonfiguration auf das Limit angerechnet. |
Maximale Anzahl Indexeinträge für jedes Dokument |
40.000 Die Anzahl der Indexeinträge ist die Summe von Folgendem für ein Dokument:
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: |
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 Richtlinien zur Gültigkeitsdauer (TTL) verwenden, beachten Sie, dass die TTL muss ein Zeitstempel sein. 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. |
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 den Abschnitt Indexierung , die Sie bei der Optimierung der Leistung und Kosten von Firestore-Abfragen
Weitere Informationen zum Beheben von Indexierungsproblemen (Index-Fanout, INVALID_ARGUMENT
-Fehler) finden Sie auf der Seite zur Fehlerbehebung.