Dotyczy tylko wersji Cloud Firestore Enterprise. |
Na tej stronie opisujemy indeksowanie w Cloud Firestore w trybie zgodności z MongoDB. Cloud Firestore w trybie zgodności z MongoDB 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,
- listę pól w danej kolekcji,
- kolejność (rosnąca lub malejąca) 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 są odrębnymi 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 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 działanie, 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 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 określonym 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ść tablicy, musisz usunąć istniejące zwykłe indeksy w tym polu i odtworzyć je 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ą 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.posts
iusers.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 ze zduplikowanymi 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.
Pola nieobecne 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ć niepowtarzalny. 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 jest taki sam.
To samo zachowanie dotyczy indeksów unikalnych z wieloma polami.
Podczas tworzenia lub aktualizowania dokumentu brakujące pola indeksowane są ustawiane na null
, a wynikowy wpis indeksu musi być unikalny w indeksie.
Rozwiązywanie problemów z błędami tworzenia 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 w dokumencie. Jeśli tworzenie 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 jedno z indeksowanych pól zawiera wartość tablicy. 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ż jedno pole z wartością tablicową. Aby kontynuować, zmodyfikuj model danych lub definicje indeksów.
- 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ć