Na tej stronie dowiesz się, jak działa indeksowanie w Cloud Firestore. Cloud Firestore domyślnie nie tworzy żadnych indeksów. Aby 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łączyć opcje rozproszony, wielokluczowy lub unikalny.
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 na potrzeby zapytania 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 nieistniejące pola są traktowane jako mające wartość NULL. Aby zmienić to zachowanie, możesz zdefiniować indeks jako 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ść.
Indeksy wielokluczowe dla wartości tablicowych
Jeśli tworzysz indeks w polu, które zawiera wartości tablicowe, musisz utworzyć indeks wielokluczowy. Zwykły indeks nie może indeksować wartości tablicowych. Indeks wielokluczowy obsługuje maksymalnie 1 pole tablicowe w definicji indeksu i może być używany do operacji, które przechodzą przez wartości tablicowe.
Indeksów wielokluczowych używaj tylko wtedy, gdy wiesz, że musisz indeksować wartości tablicowe. Zwykłe indeksy mają zalety podczas przetwarzania zapytania. Na przykład zwykłe indeksy mogą skuteczniej filtrować wartości w zakresie.
W tych sytuacjach podczas pracy z wartościami tablicowymi i indeksami wielokluczowymi występują błędy:
- Operacja próbuje dodać wartość tablicową do pola indeksowanego przez zwykły indeks. Aby dodać wartość tablicową, musisz usunąć istniejące zwykłe indeksy w tym polu i utworzyć je ponownie jako indeksy wielokluczowe.
- Próbujesz utworzyć zwykły indeks w polu, które zawiera wartość tablicową. Musisz utworzyć indeks wielokluczowy lub usunąć wartości tablicowe.
- Operacja próbuje indeksować wiele pól z wartościami tablicowymi. W indeksie wielokluczowym nie może być więcej niż 1 pola z wartością tablicową. Aby kontynuować, zmodyfikuj model danych lub definicje indeksów.
- Próbujesz utworzyć indeks wielokluczowy, w którym 2 ścieżki pól mają wspólny prefiks, np.
users.postsiusers.zip.
Indeksy unikalne
Ustaw opcję indeksu unikalnego, 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ć indeks unikalny, kompilacja indeksu nie powiedzie się i w szczegółach operacji pojawi się komunikat o błędzie.
Brakujące pola w indeksie unikalnym
Jeśli wstawisz dokument z brakującymi polami dla indeksu unikalnego, indeks ustawi wartości null dla brakujących pól. Wynikowy wpis indeksu musi być unikalny, w przeciwnym razie operacja się nie powiedzie.
Na przykład w przypadku tego indeksu:
db.cities.createIndex( { "name": 1 }, { unique: true } )
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 indeksu unikalnego będzie taki sam.
To samo zachowanie dotyczy indeksów unikalnych z wieloma polami.
Podczas tworzenia lub aktualizowania dokumentu brakujące zindeksowane pola są ustawiane na null, a wynikowy wpis indeksu musi być unikalny w indeksie.
Indeksy TTL
Używaj indeksów TTL, aby automatycznie usuwać nieaktualne dane z baz danych. Indeks TTL wyznacza dane pole jako czas wygaśnięcia dokumentów w danej kolekcji. Dzięki TTL możesz zmniejszyć koszty przechowywania, usuwając przestarzałe dane. Dane są zwykle usuwane w ciągu 24 godzin po upłynięciu ich czasu wygaśnięcia.
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.
- Wymagany jest indeks wielokluczowy. Co najmniej 1 z zindeksowanych pól zawiera wartość tablicową. Aby kontynuować, musisz użyć indeksu wielokluczowego lub usunąć wartości tablicowe.
- Operacja próbuje indeksować wiele pól z wartościami tablicowymi. W indeksie wielokluczowym nie może być więcej niż 1 pola z wartością tablicową. Aby kontynuować, zmodyfikuj model danych lub definicje indeksów.
- Ustawisz opcję indeksu unikalnego, a dane w zindeksowanych polach utworzą duplikaty wpisów indeksu. Aby kontynuować, usuń z danych duplikaty kombinacji wartości.
Co dalej?
- Dowiedz się, jak tworzyć indeksy i nimi zarządzać lub jak tworzyć indeksy TTL i nimi zarządzać