Ta sekcja opisuje indeksowanie w wersji Firestore Enterprise. W wersji Firestore Enterprise domyślnie nie są tworzone żadne indeksy. Aby obniżyć koszty i zwiększyć wydajność bazy danych, utwórz indeksy dla najczęściej używanych zapytań.
Indeksy mają duży wpływ na wydajność bazy danych. Jeśli dla zapytania istnieje indeks, baza danych może efektywnie zwracać wyniki, zmniejszając ilość danych, które trzeba przeskanować, oraz ilość pracy potrzebnej do posortowania wyników. Wpisy indeksu zwiększają jednak koszty przechowywania i ilość pracy wykonywanej podczas operacji zapisu w zindeksowanych polach.
Definicja i struktura indeksu
Indeks składa się z tych elementów:
- identyfikator kolekcji,
- lista pól w danej kolekcji,
- kolejność (rosnąca lub malejąca) dla każdego pola.
Indeks może też włączać opcje rozproszone lub unikalne.
Kolejność indeksowania
Kolejność i kierunek sortowania każdego pola jednoznacznie definiują indeks. Na przykład te indeksy są 2 różnymi indeksami i nie można ich zamieniać:
| Kolekcja | Pola |
|---|---|
| miejscowości | kraj (rosnąco), populacja (malejąco) |
| miejscowości | populacja (malejąco), kraj (rosnąco) |
Podczas tworzenia indeksu obsługującego zapytanie uwzględnij pola w tej samej kolejności co w zapytaniu.
Gęstość indeksu
Domyślnie wpisy indeksu przechowują dane ze wszystkich dokumentów w kolekcji. Jest to tzw. indeks nierozproszony. Wpis indeksu zostanie dodany do dokumentu niezależnie od tego, czy dokument zawiera którekolwiek z pól określonych w indeksie. Podczas generowania wpisów indeksu pola, które nie istnieją, są traktowane jako mające wartość NULL. Aby zmienić to zachowanie, możesz zdefiniować indeks jako indeks rozproszony.
Indeksy rozproszone
Indeks rozproszony indeksuje tylko te dokumenty w kolekcji, które zawierają wartość (w tym wartość null) w co najmniej 1 z zindeksowanych pól. Indeks rozproszony zmniejsza koszty przechowywania i może zwiększyć wydajność.
Unikalne indeksy
Ustaw opcję unikalnego indeksu, aby wymusić unikalne wartości w zindeksowanych polach. W przypadku indeksów w wielu polach każda kombinacja wartości musi być unikalna w całym indeksie. Baza danych odrzuca wszystkie operacje aktualizacji i wstawiania, które próbują utworzyć wpisy indeksu z duplikatami wartości. Jeśli dane w zindeksowanych polach zawierają duplikaty wartości i próbujesz utworzyć unikalny indeks, kompilacja indeksu nie powiedzie się i w szczegółach operacji pojawi się komunikat o błędzie.
Brakujące pola w unikalnym indeksie
Jeśli wstawisz dokument z brakującymi polami dla unikalnego indeksu, indeks ustawi dla tych pól wartości null. Wynikowy wpis indeksu musi być unikalny, w przeciwnym razie operacja się nie powiedzie.
Na przykład w przypadku tego indeksu:
| Kolekcja | Zindeksowane pola | Zakres zapytania |
|---|---|---|
| miejscowości | nazwa (rosnąco) | Kolekcja |
Jeśli dodasz do kolekcji dokument {"abbreviation": "LA"}, unikalny
indeks utworzy wpis z polem name ustawionym na null. Jeśli następnie spróbujesz dodać
dokument {"abbreviation": "NYC"}, operacja się nie powiedzie, ponieważ wynikowy
wpis dla unikalnego indeksu będzie taki sam.
To samo zachowanie dotyczy unikalnych indeksów z wieloma polami.
Podczas tworzenia lub aktualizowania dokumentu brakujące zindeksowane pola są ustawiane na null, a wynikowy wpis indeksu musi być unikalny.
Rozwiązywanie problemów z błędami kompilacji indeksu
Podczas zarządzania indeksami mogą wystąpić błędy kompilacji indeksu. Operacja indeksowania może się nie powieść, jeśli baza danych napotka problem z danymi. Operacje indeksowania mogą się nie powieść z tych powodów:
- Osiągnięto limit indeksu. Na przykład operacja mogła osiągnąć maksymalną liczbę wpisów indeksu na dokument. Jeśli utworzenie indeksu się nie powiedzie, zobaczysz komunikat o błędzie. Jeśli nie osiągnięto limitu indeksu, spróbuj ponownie wykonać operację indeksowania.
- Ustawiono opcję unikalnego indeksu, a dane w zindeksowanych polach spowodowałyby utworzenie duplikatów wpisów indeksu. Aby kontynuować, usuń z danych duplikaty kombinacji wartości.
Co dalej?
Dowiedz się, jak tworzyć indeksy i nimi zarządzać.