Indeksy są ważnym czynnikiem wpływającym na wydajność bazy danych. Podobnie jak indeks książki, który mapuje tematy w książce na numery stron, indeks bazy danych mapuje elementy w bazie danych na ich lokalizacje w bazie danych. Gdy wysyłasz zapytanie do bazy danych, może ona użyć indeksu, aby szybko zidentyfikować lokalizacje żądanych elementów.
Na tej stronie opisujemy 2 typy indeksów używanych przez Cloud Firestore: indeksy automatyczne i indeksy ręczne.
Definicja i struktura indeksu
Indeks jest definiowany na liście pól danego dokumentu, z odpowiednim trybem indeksowania dla każdego pola.
Indeks zawiera wpis dla każdego pola wymienionego w definicji indeksu. Indeks zawiera wszystkie dokumenty, które są potencjalnymi wynikami zapytań opartych na indeksie. Dokument jest uwzględniany w indeksie tylko wtedy, gdy ma ustawioną zindeksowaną wartość dla każdego pola używanego w indeksie. Jeśli definicja indeksu odnosi się do pola, dla którego dokument nie ma ustawionej wartości, ten dokument nie pojawi się w indeksie. W takim przypadku dokument nigdy nie zostanie zwrócony jako wynik żadnego zapytania opartego na indeksie.
Indeks jest sortowany według wartości pól w kolejności określonej w definicji indeksu.
Indeks za każdym zapytaniem
Jeśli dla zapytania nie ma indeksu, większość baz danych przeszukuje zawartość element po elemencie. Jest to powolny proces, który staje się jeszcze wolniejszy w miarę rozrastania się bazy danych. Cloud Firestore zapewnia wysoką wydajność zapytań, używając indeksów w przypadku wszystkich zapytań. W efekcie wydajność zapytania zależy od rozmiaru zbioru wyników, a nie od liczby elementów w bazie danych.
Mniej zarządzania indeksami, więcej tworzenia aplikacji
Cloud Firestore zawiera funkcje, które skracają czas potrzebny na zarządzanie indeksami. Indeksy wymagane do obsługi najbardziej podstawowych zapytań są tworzone automatycznie. Gdy używasz i testujesz aplikację, Cloud Firestore pomaga Ci identyfikować i tworzyć dodatkowe indeksy, których wymaga aplikacja.
Typy indeksów
Cloud Firestore używa 2 rodzajów indeksów: automatycznych i ręcznych. Indeksy ręczne i automatyczne różnią się sposobem zarządzania.
Indeksy automatyczne
Domyślnie Cloud Firestore automatycznie tworzy indeksy dla każdego pola obecnego w dokumentach w kolekcji. Te indeksy pojedynczego pola umożliwiają wykonywanie wielu podstawowych zapytań. Indeksami automatycznymi zarządzasz, konfigurując ustawienia automatycznego indeksowania bazy danych i wykluczenia indeksów.
Domyślne ustawienia indeksu automatycznego
Cloud Firestore używa tych domyślnych ustawień indeksów automatycznych:
Dla każdego pola, które nie jest tablicą ani mapą, Cloud Firestore definiuje 2 indeksy w zakresie kolekcji – jeden w trybie rosnącym i jeden w trybie malejącym.
Dla każdego pola mapy Cloud Firestore tworzy:
- 1 rosnący indeks o zakresie kolekcji dla każdego podpola, które nie jest tablicą ani mapą.
- 1 indeks malejący o zakresie kolekcji dla każdego podpola, które nie jest tablicą ani mapą.
- 1 indeks rosnący w zakresie kolekcji dla całej wartości mapy,
- 1 indeks malejący o zakresie kolekcji dla całej wartości mapy,
- 1 indeks array-contains o zakresie kolekcji dla każdego podpola tablicy.
- Cloud Firestore indeksuje rekurencyjnie każde podpole mapy.
Dla każdego pola tablicy w dokumencie Cloud Firestore tworzy:
- 1 indeks rosnący o zakresie kolekcji dla całej wartości tablicy,
- 1 indeks malejący w zakresie kolekcji dla całej wartości tablicy.
- 1 indeks typu „tablica zawiera” o zakresie kolekcji.
Indeksy automatyczne z zakresem grupy kolekcji nie są domyślnie utrzymywane.
Wykluczenia indeksów automatycznych
Możesz wykluczyć pole z ustawień automatycznego indeksowania, tworząc wykluczenie indeksowania. Wykluczenie z indeksowania zastępuje ustawienia automatycznego indeksu dotyczące całej bazy danych. Wykluczenie pozwala włączyć indeks, który w innym przypadku zostałby wyłączony przez ustawienia automatycznego indeksowania, lub wyłączyć indeks, który w innym przypadku zostałby włączony przez ustawienia automatycznego indeksowania. Przykłady sytuacji, w których zwolnienia mogą być przydatne, znajdziesz w sprawdzonych metodach indeksowania.
Użyj wartości ścieżki pola *, aby dodać wykluczenia indeksu na poziomie kolekcji we wszystkich polach w grupie kolekcji. Na przykład w przypadku grupy kolekcji comments ustaw ścieżkę pola na *, aby dopasować wszystkie pola w grupie kolekcji comments i wyłączyć indeksowanie wszystkich pól w tej grupie. Następnie możesz dodać wykluczenia, aby indeksować tylko pola wymagane w zapytaniach. Zmniejszenie liczby indeksowanych pól obniża koszty miejsca na dane i może zwiększyć wydajność zapisu.
Jeśli utworzysz wykluczenie indeksu dla pola mapy, pola podrzędne mapy odziedziczą te ustawienia. Możesz jednak zdefiniować wykluczenia indeksu dla konkretnych pól podrzędnych. Jeśli usuniesz wykluczenie dla podpola, podpole odziedziczy ustawienia wykluczenia elementu nadrzędnego, jeśli istnieją, lub ustawienia całej bazy danych, jeśli nie ma wykluczeń elementu nadrzędnego.
Informacje o tworzeniu wykluczeń indeksów automatycznych i zarządzaniu nimi znajdziesz w artykule o zarządzaniu indeksami.
Indeksy ręczne
W indeksie ręcznym przechowywane jest posortowane mapowanie wszystkich dokumentów w kolekcji na podstawie uporządkowanej listy pól do zindeksowania.
Cloud Firestore używa indeksów ręcznych do obsługi zapytań, których nie obsługują indeksy automatyczne.
Domyślnie Cloud Firestore automatycznie tworzy indeksy jednopolowe dla każdego pola w kolekcji. Cloud Firestore nie tworzy automatycznie indeksów dla kombinacji pól ze względu na dużą liczbę możliwych kombinacji. Zamiast tego Cloud Firestore pomaga identyfikować i tworzyć wymagane indeksy podczas tworzenia aplikacji.
Za każdym razem, gdy spróbujesz wykonać zapytanie, które nie jest obsługiwane przez istniejący indeks, Cloud Firestore zwróci komunikat o błędzie z linkiem, który możesz kliknąć, aby utworzyć brakujący indeks.
Możesz też definiować indeksy i zarządzać nimi ręcznie za pomocą konsoli lub interfejsu wiersza poleceń Firebase. Więcej informacji o tworzeniu indeksów ręcznych i zarządzaniu nimi znajdziesz w artykule Zarządzanie indeksami.
Tryby indeksowania i zakresy zapytań
Indeksy automatyczne i ręczne konfiguruje się inaczej, ale w obu przypadkach musisz skonfigurować tryby indeksowania i zakresy zapytań.
Tryby indeksowania
Podczas definiowania indeksu wybierasz tryb indeksowania dla każdego indeksowanego pola. Tryb indeksowania każdego pola obsługuje określone klauzule zapytania dotyczące tego pola. Do wyboru masz te tryby indeksowania:
| Tryb indeksowania | Opis |
|---|---|
| Rosnąco | Obsługuje klauzule zapytania <, <=, ==, >=, >, !=, in i not-in w polu oraz sortowanie wyników w kolejności rosnącej na podstawie wartości tego pola. |
| Malejąco | Obsługuje klauzule zapytania <, <=, ==, >=, >, !=, in i not-in w polu oraz sortowanie wyników w kolejności malejącej na podstawie wartości tego pola. |
| Array‑contains | Obsługuje klauzule zapytania array-contains i array-contains-any w polu. |
| Wektor | Obsługuje klauzule zapytania FindNearest w polu. |
Zakresy zapytań
Każdy indeks jest ograniczony do kolekcji lub grupy kolekcji. Jest to tzw. zakres zapytania indeksu:
- Zakres kolekcji
- Cloud Firestore domyślnie tworzy indeksy z zakresem kolekcji. Te indeksy obsługują zapytania, które zwracają wyniki z pojedynczej kolekcji.
- Zakres grupy kolekcji
- Grupa kolekcji obejmuje wszystkie kolekcje o tym samym identyfikatorze. Aby uruchomić zapytanie dotyczące grupy kolekcji, które zwraca przefiltrowane lub uporządkowane wyniki z grupy kolekcji, musisz utworzyć odpowiedni indeks z zakresem grupy kolekcji.
Domyślne sortowanie i pole __name__
Oprócz sortowania dokumentów według trybów indeksowania określonych dla każdego pola (rosnąco lub malejąco) indeksy stosują ostateczne sortowanie według pola __name__ każdego dokumentu. Wartość pola __name__ jest ustawiona na pełną ścieżkę dokumentu. Oznacza to, że dokumenty w zbiorze wyników z tymi samymi wartościami pól są sortowane według ścieżki dokumentu.
Domyślnie pole __name__ jest sortowane w tym samym kierunku co ostatnie posortowane pole w definicji indeksu. Przykład:
| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| miejscowości | , __name__ |
Kolekcja |
| miejscowości | , __name__ |
Kolekcja |
| miejscowości | , kraj, , populacja, , __name__ |
Kolekcja |
Aby posortować wyniki według kierunku innego niż domyślny (__name__), musisz utworzyć ten indeks.
Właściwości indeksu
Indeks, który umożliwia najbardziej efektywne wykonywanie zapytania, jest definiowany przez te właściwości:
- Pola używane w filtrach równości
- Pola używane w kolejności sortowania
- pola używane w filtrach zakresu i nierówności (które nie są jeszcze uwzględnione w kolejności sortowania);
- pola używane w agregacjach (które nie są jeszcze uwzględnione w kolejności sortowania oraz filtrach zakresu i nierówności).
Cloud Firestore oblicza wyniki zapytań w ten sposób:
- Identyfikuje indeks odpowiadający kolekcji zapytania, właściwościom filtra, operatorom filtra i kolejności sortowania.
- Określa pozycję indeksu, od której rozpoczyna się skanowanie. Pozycja początkowa jest poprzedzona filtrami równości zapytania i kończy się filtrami zakresu i nierówności w pierwszym polu
orderBy. - Rozpoczyna skanowanie indeksu i zwraca każdy dokument, który spełnia wszystkie filtry, dopóki proces skanowania nie wykona jednej z tych czynności:
- napotka dokument, który nie spełnia warunków filtra, i potwierdzi, że żaden kolejny dokument nigdy nie będzie w pełni spełniać warunków filtra.
- osiągnie koniec indeksu.
- Zbiera maksymalną liczbę wyników żądanych przez zapytanie.
Przykład indeksowania
Dzięki automatycznemu tworzeniu indeksów jednopolowych Cloud Firestore umożliwia aplikacji szybką obsługę najbardziej podstawowych zapytań do bazy danych.
Indeksy jednopolowe umożliwiają wykonywanie prostych zapytań na podstawie wartości pól i komparatorów <, <=, ==, >=, > i in. W przypadku pól tablicowych umożliwiają wykonywanie zapytań array-contains i array-contains-any.
Aby to zilustrować, przeanalizuj poniższe przykłady z punktu widzenia tworzenia indeksu. Ten fragment kodu tworzy kilka dokumentów city w kolekcji cities i ustawia pola name, state, country, capital, population i regions dla każdego dokumentu:
Sieć
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"] });
Przy domyślnych ustawieniach automatycznego indeksowania Cloud Firestore aktualizuje 1 rosnący indeks pojedynczego pola na pole, 1 malejący indeks pojedynczego pola na pole i 1 indeks pojedynczego pola array-contains dla pola tablicy. Każdy wiersz w poniższej tabeli odpowiada wpisowi w indeksie jednopolowym:
| Kolekcja | Zindeksowane pole | Zakres zapytania |
|---|---|---|
| miejscowości | Nazwa zasobu | Kolekcja |
| miejscowości | stan | Kolekcja |
| miejscowości | kraj | Kolekcja |
| miejscowości | – kapitał | Kolekcja |
| miejscowości | Populacja: | Kolekcja |
| miejscowości | regionu | Kolekcja |
| miejscowości | Nazwa zasobu | Kolekcja |
| miejscowości | stan | Kolekcja |
| miejscowości | kraj | Kolekcja |
| miejscowości | – kapitał | Kolekcja |
| miejscowości | Populacja: | Kolekcja |
| miejscowości | regionu | Kolekcja |
| miejscowości | array-contains regionu |
Kolekcja |
Zapytania obsługiwane przez indeksy pojedynczego pola
Korzystając z tych automatycznie utworzonych indeksów jednopolowych, możesz uruchamiać proste zapytania, takie jak:
Sieć
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
Możesz też tworzyć zapytania in i zapytania o równość złożoną (==):
Sieć
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)Jeśli chcesz uruchomić zapytanie złożone, które używa porównania zakresu (<, <=, > lub >=), lub jeśli chcesz posortować według innego pola, musisz utworzyć indeks ręczny dla tego zapytania.
Indeks array-contains umożliwia wysyłanie zapytań do pola tablicy regions:
Sieć
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"])
Zapytania obsługiwane przez indeksy ręczne
Utwórz indeksy ręczne, aby obsługiwać zapytania złożone, które nie są jeszcze obsługiwane przez automatyczne indeksy pojedynczego pola. Na przykład indeks ręczny jest potrzebny w przypadku tych zapytań:
Sieć
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)Te zapytania wymagają tego indeksu. Ponieważ zapytanie używa równości (== lub in) w polu country, możesz użyć w tym polu trybu indeksu rosnącego lub malejącego. Domyślnie klauzule nierówności stosują kolejność sortowania rosnąco na podstawie pola w klauzuli nierówności.
| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| miejscowości | (lub ) kraj, populacja | Kolekcja |
Aby uruchomić te same zapytania, ale z kolejnością sortowania malejąco, potrzebujesz dodatkowego indeksu w kierunku malejącym dla właściwości population:
Sieć
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")| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| miejscowości | kraj, mieszkańców | Kolekcja |
| cities | kraj, populacja | Kolekcja |
Aby uniknąć spadku wydajności spowodowanego scalaniem indeksów, zalecamy utworzenie indeksu, który połączy zapytanie array-contains lub array-contains-any z dodatkowymi klauzulami:
Sieć
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)
| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| miejscowości | array-contains tags, (lub ) capital | Kolekcja |
Zapytania obsługiwane przez indeksy grup kolekcji
Aby zademonstrować indeks z zakresem grupy kolekcji, dodaj podkolekcję landmarks do niektórych dokumentów city:
Sieć
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" });
Korzystając z poniższego indeksu z jednym polem i zakresem kolekcji, możesz wysłać zapytanie do kolekcji landmarks pojedynczego miasta na podstawie pola category:
| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| punkty orientacyjne, | Kategoria (lub ) | Kolekcja |
Sieć
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])Jeśli chcesz na przykład wysłać zapytanie o punkty orientacyjne we wszystkich miastach, uruchom to zapytanie w grupie kolekcji, która składa się ze wszystkich kolekcji landmarks. Musisz też włączyć landmarks indeks pojedynczego pola z zakresem grupy kolekcji:
| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| punkty orientacyjne, | Kategoria (lub ) | Grupa kolekcji |
Po włączeniu tego indeksu możesz wysyłać zapytania do grupy kolekcji landmarks:
Sieć
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
Aby uruchomić zapytanie dotyczące grupy kolekcji, które zwraca przefiltrowane lub uporządkowane wyniki, musisz włączyć odpowiedni indeks z zakresem grupy kolekcji. Zapytania dotyczące grup kolekcji, które nie filtrują ani nie porządkują wyników, nie wymagają jednak żadnych dodatkowych definicji indeksów.
Możesz na przykład uruchomić to zapytanie dotyczące grupy kolekcji bez włączania dodatkowego indeksu:
Sieć
db.collectionGroup("landmarks").get()Wpisy indeksu
Liczba wpisów indeksu dla dokumentu zależy od skonfigurowanych indeksów projektu i struktury dokumentu. Wpisy indeksu wliczają się do limitu liczby wpisów indeksu.
Poniższy przykład pokazuje wpisy indeksu dokumentu.
Dokument
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Indeksy automatyczne
- city_name ASC
- city_name DESC
- dzielnice rosnąco
- dzielnice MALEJĄCO
- temperatury rosnąco
- temperatures DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- neighborhoods Array Contains
Indeksy ręczne
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
Wpisy indeksu
Ta konfiguracja indeksowania powoduje utworzenie tych wpisów indeksu dla dokumentu:
| Indeks | Zindeksowane dane |
|---|---|
| Automatyczne wpisy indeksu | |
| city_name ASC | city_name: "San Francisco" |
| city_name DESC | city_name: "San Francisco" |
| dzielnice rosnąco | neighborhoods: ["Mission", "Downtown", "Marina"] |
| dzielnice MALEJĄCO | neighborhoods: ["Mission", "Downtown", "Marina"] |
| temperatury rosnąco | temperatures: {summer: 67, winter: 55} |
| temperatures DESC | temperatures: {summer: 67, winter: 55} |
| temperatures.summer ASC | temperatures.summer: 19 |
| temperatures.summer DESC | temperatures.summer: 19 |
| temperatures.winter ASC | temperatures.winter: 55 |
| temperatures.winter DESC | temperatures.winter: 55 |
| dzielnice Tablica zawiera | neighborhoods: "Mission" |
| neighborhoods Array Contains | neighborhoods: "Downtown" |
| neighborhoods Array Contains | neighborhoods: "Marina" |
| Ręczne wpisy indeksu | |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
Indeksy i ceny
Indeksy wpływają na koszty miejsca na dane aplikacji. Więcej informacji o obliczaniu rozmiaru miejsca na dane dla indeksów znajdziesz w artykule Rozmiar wpisu indeksu.
Używanie scalania indeksów
Chociaż Cloud Firestore używa indeksu w każdym zapytaniu, niekoniecznie wymaga jednego indeksu na zapytanie. W przypadku zapytań z wieloma klauzulami równości (==) i opcjonalnie klauzulą orderBy Cloud Firestore może ponownie użyć istniejących indeksów. Cloud Firestore może scalać indeksy prostych filtrów równości, aby tworzyć indeksy potrzebne do obsługi większych zapytań równości.
Możesz obniżyć koszty indeksowania, identyfikując sytuacje, w których możesz użyć scalania indeksów. Na przykład w kolekcji restaurants aplikacji do oceniania restauracji:
restauracja
burgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Ta aplikacja używa zapytań takich jak poniższe. Aplikacja używa kombinacji klauzul równości dla pól category, city i editors_pick, zawsze sortując według pola star_rating w porządku rosnącym:
Sieć
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")Możesz utworzyć indeks dla każdego zapytania:
| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| restauracje | kategoria, star_rating | Kolekcja |
| restauracje | city, star_rating | Kolekcja |
| restauracje | category, city, star_rating | Kolekcja |
| restauracje | category, city, editors_pick, star_rating | Kolekcja |
Lepszym rozwiązaniem jest zmniejszenie liczby indeksów przez wykorzystanie możliwości Cloud Firestore do scalania indeksów w przypadku klauzul równości:
| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| restauracje | kategoria, star_rating | Kolekcja |
| restauracje | city, star_rating | Kolekcja |
| restauracje | editors_pick, star_rating | Kolekcja |
Ten zestaw indeksów jest nie tylko mniejszy, ale obsługuje też dodatkowe zapytanie:
Sieć
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")Limity indeksowania
W przypadku indeksów obowiązują podane niżej limity. Więcej informacji o limitach znajdziesz w artykule Limity.
| Limit | Szczegóły |
|---|---|
| Maksymalna liczba indeksów złożonych w bazie danych |
|
| Maksymalna liczba konfiguracji pojedynczego pola w bazie danych |
Jedna konfiguracja na poziomie pola może zawierać wiele konfiguracji tego samego pola. Na przykład wykluczenie indeksowania pojedynczego pola i zasada TTL dla tego samego pola liczą się jako jedna konfiguracja pola w ramach limitu. |
|
Maksymalna liczba wpisów indeksu dla każdego dokumentu |
40 000 Liczba wpisów indeksu jest sumą tych wartości dla dokumentu:
Aby zobaczyć, jak Cloud Firestore przekształca dokument i zestaw indeksów we wpisy indeksu, zapoznaj się z tym przykładem liczby wpisów indeksu. |
| Maksymalna liczba pól w indeksie wieloskładnikowym | 100 |
| Maksymalny rozmiar wpisu indeksu |
7,5 KiB Aby dowiedzieć się, jak Cloud Firestore oblicza rozmiar wpisu indeksu, zobacz rozmiar wpisu indeksu. |
| Maksymalna suma rozmiarów wpisów indeksu dokumentu |
8 MiB Łączny rozmiar to suma tych elementów dokumentu: |
| Maksymalny rozmiar wartości indeksowanego pola |
1500 bajtów Wartości pól przekraczające 1500 bajtów są obcinane. Zapytania dotyczące obciętych wartości pól mogą zwracać niespójne wyniki. |
Sprawdzone metody dotyczące indeksowania
W przypadku większości aplikacji możesz polegać na automatycznym indeksowaniu i linkach w komunikatach o błędach, aby zarządzać indeksami. Możesz jednak dodać wykluczenia automatycznego indeksowania w tych przypadkach:
| Zgłoszenie | Opis |
|---|---|
| Duże pola ciągów znaków | Jeśli masz pole ciągu, które często zawiera długie wartości ciągu, których nie używasz do tworzenia zapytań, możesz obniżyć koszty miejsca na dane, wyłączając to pole z indeksowania. |
| Wysokie częstotliwości zapisu w kolekcji zawierającej dokumenty z wartościami sekwencyjnymi | Jeśli indeksujesz pole, którego wartość rośnie lub maleje sekwencyjnie między dokumentami w kolekcji, np. sygnaturę czasową, maksymalna szybkość zapisu w kolekcji wynosi 500 zapisów na sekundę. Jeśli nie wysyłasz zapytań na podstawie pola z wartościami sekwencyjnymi, możesz wyłączyć to pole z indeksowania, aby ominąć ten limit. Na przykład w przypadku IoT z wysokim współczynnikiem zapisu kolekcja zawierająca dokumenty z polem sygnatury czasowej może zbliżyć się do limitu 500 zapisów na sekundę. |
| Pola TTL |
Jeśli używasz zasad TTL (czasu życia danych), pamiętaj, że pole TTL musi być sygnaturą czasową. Indeksowanie pól TTL jest domyślnie włączone i może wpływać na wydajność przy większym natężeniu ruchu. Zalecamy dodanie wykluczeń indeksowania automatycznego dla pól TTL. |
| Duże pola tablic lub map | Duże pola tablicy lub mapy mogą zbliżyć się do limitu 40 000 wpisów indeksu na dokument. Jeśli nie wysyłasz zapytań na podstawie dużej tablicy lub pola mapy, wyłącz je z indeksowania. |
Jeśli używasz zapytań z operatorami zakresu i nierówności w wielu polach, zapoznaj się z uwagami dotyczącymi indeksowania, które należy wziąć pod uwagę, aby zoptymalizować wydajność i koszt zapytań Cloud Firestore.
Więcej informacji o rozwiązywaniu problemów z indeksowaniem (fanout indeksu, błędy INVALID_ARGUMENT) znajdziesz na stronie rozwiązywania problemów.