Na tej stronie opisujemy indeksowanie w przypadku 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 wydajnie zwracać wyniki, zmniejszając ilość danych, które należy przeskanować, oraz nakład pracy potrzebny do posortowania wyników. Wpisy indeksu zwiększają jednak koszty przechowywania i ilość pracy wykonywanej podczas operacji zapisu w polach indeksowanych.
Definicja i struktura indeksu
Indeks składa się z tych elementów:
- identyfikator kolekcji,
- lista pól w danej kolekcji,
- kolejność (rosnącą lub malejącą) dla każdego pola;
Indeks może też włączyć opcje sparse, multikey lub unique.
Kolejność indeksów
Kolejność i kierunek sortowania każdego pola jednoznacznie definiują indeks. Na przykład te indeksy to 2 różne indeksy, których nie można stosować zamiennie:
| 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 niepełny. Wpis indeksu zostanie dodany do dokumentu niezależnie od tego, czy zawiera on 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 indeks rzadki.
Indeksy rzadkie
Indeks rzadki indeksuje tylko dokumenty w kolekcji, które zawierają wartość (w tym wartość null) w co najmniej 1 z zindeksowanych pól. Indeks rzadki obniża koszty przechowywania i może zwiększyć wydajność.
Indeksy wielokluczowe dla wartości tablicowych
Jeśli tworzysz indeks w polu zawierającym wartości tablicowe, musisz utworzyć indeks wielokluczowy. Zwykły indeks nie może indeksować wartości tablicowych. Indeks wielokluczowy obsługuje maksymalnie jedno 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 zapytań. Na przykład zwykłe indeksy mogą skuteczniej filtrować wartości w określonym zakresie.
W pracy z wartościami tablicowymi i indeksami wielokluczowymi mogą wystąpić te błędy:
- Operacja próbuje dodać wartość tablicową do pola indeksowanego przez zwykły indeks. Aby dodać wartość tablicy, 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ść tablicy. 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ż jedno pole z wartością tablicy. 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ę 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 ramach indeksu. Baza danych odrzuca wszystkie operacje aktualizacji i wstawiania, które próbują utworzyć wpisy indeksu z powtarzającymi się wartościami. Jeśli dane w zindeksowanych polach zawierają zduplikowane wartości i spróbujesz utworzyć unikalny indeks, jego budowanie zakończy się niepowodzeniem, a 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 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:
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 w indeksie unikalnym będzie taki sam.
To samo zachowanie dotyczy indeksów unikalnych z wieloma polami.
Podczas tworzenia lub aktualizowania dokumentu brakujące indeksowane pola są ustawiane na null, a wynikowy wpis indeksu musi być unikalny w indeksie.
Indeksy TTL
Używaj indeksów TTL, aby automatycznie usuwać z baz danych nieaktualne dane. Indeks TTL wyznacza określone pole jako czas wygaśnięcia dokumentów w danej kolekcji. Dzięki TTL możesz obniżyć koszty przechowywania, usuwając przestarzałe dane. Dane są zwykle usuwane w ciągu 24 godzin po upłynięciu ich daty ważności.
Rozwiązywanie problemów z tworzeniem indeksu
Podczas zarządzania indeksami mogą wystąpić błędy tworzenia indeksu. Operacja indeksowania może się nie powieść, jeśli w bazie danych wystąpi 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 indeksowanych 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 z wieloma kluczami nie może być więcej niż 1 pole z wartością tablicy. Aby kontynuować, zmodyfikuj model danych lub definicje indeksu.
- Ustawisz opcję unikalnego indeksu, a dane indeksowanych pól utworzą zduplikowane wpisy indeksu. Aby kontynuować, usuń z danych zduplikowane kombinacje wartości.
Co dalej?
- Dowiedz się, jak tworzyć indeksy i nimi zarządzać lub indeksy TTL.