Omówienie indeksów

Na tej stronie opisano 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 skutecznie zwracać wyniki, zmniejszając ilość danych, które trzeba przeskanować, i ograniczając pracę potrzebną do posortowania wyników. Wpisy indeksu zwiększają jednak koszty miejsca na dane i ilość pracy wykonywanej podczas operacji zapisu w indeksowanych polach.

Definicja i struktura indeksu

Indeks składa się z tych elementów:

  • identyfikator kolekcji,
  • lista pól w danej kolekcji,
  • kolejność (rosnąco lub malejąco) dla każdego pola.

Indeks może też włączyć opcje sparse, multikey lub unique.

Porządkowanie indeksów

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 używać zamiennie:

Kolekcja Pola
miejscowości kraj (rosnąco), populacja (malejąco)
miejscowości populacja (malejąco), kraj (rosnąco),

Podczas tworzenia indeksu do obsługi 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 działanie, możesz zdefiniować indeks jako rozproszony.

Indeksy rozproszone

Indeks rozproszony indeksuje tylko te dokumenty w kolekcji, które zawierają wartość (w tym null) w co najmniej 1 z indeksowanych pól. Indeks rozproszony obniża koszty miejsca na dane 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 tablicy w definicji indeksu i może być używany do operacji, które przechodzą przez wartości tablicy.

Używaj indeksów wielokluczowych 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.

Podczas pracy z wartościami tablicowymi i indeksami wielokluczowymi błędy występują w tych sytuacjach:

  • 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 zawierającym wartość tablicy. Musisz utworzyć indeks wielokluczowy lub usunąć wartości tablicowe.
  • Operacja próbuje zindeksować wiele pól z wartościami tablicowymi. W indeksie wielokluczowym nie możesz mieć 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.posts i users.zip.

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 ze zduplikowanymi wartościami. Jeśli dane w indeksowanych polach zawierają zduplikowane wartości i spróbujesz utworzyć unikalny indeks, jego tworzenie nie powiedzie się, a w szczegółach operacji pojawi się komunikat o błędzie.

Brakujące pola w unikalnym indeksie

Jeśli wstawisz dokument, w którym brakuje pól unikalnego indeksu, indeks ustawi wartości null dla brakujących pól. Wynikowy wpis indeksu musi być unikalny, inaczej 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 spróbujesz dodać dokument {"abbreviation": "NYC"}, operacja się nie powiedzie, ponieważ wynikowy wpis w unikalnym indeksie będzie taki sam.

To samo dotyczy unikalnych indeksów 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.

Unikalne indeksy wartości tablicowych

Unikalny indeks wielokluczowy może służyć do wymuszania, aby dokumenty nie miały nakładających się elementów tablicy.

Ten typ indeksu nie wymaga, aby tablica miała unikalne wartości w jednym dokumencie.

Na przykład z unikalnym indeksem:

db.collection.createIndex( { "tags": 1 }, { unique: true } )

Możesz wstawić ten dokument:

{
  "_id": 1,
  "tags": [ "news", "tech", "news", "music" ]
}

Indeks zezwala na zduplikowane wartości ("news") w tej samej tablicy pojedynczego dokumentu.

Jeśli spróbujesz wstawić drugi dokument ze zduplikowanym elementem, operacja się nie powiedzie:

{
  "_id": 2,
  "tags": [ "sports", "music" ]
}

Operacja nie powiedzie się, ponieważ pole "music" jest już obecne w tablicy dokumentu 1 i zmapowane w indeksie.

Jeśli chcesz mieć pewność, że elementy w tej samej tablicy w jednym dokumencie są unikalne, obsłuż to w logice aplikacji, używając operatorów aktualizacji takich jak $addToSet zamiast $push.

Puste tablice, brakujące pola i wartości null

Zwykle brakujące pola w unikalnym indeksie są traktowane jako null i muszą być unikalne w dokumentach (patrz Brakujące pola w unikalnym indeksie). Jednak w przypadku indeksów unikalnych w polach tablicy:

  • Puste tablice, brakujące pola i samodzielne wartości null: jeśli pole tablicy jest puste, całkowicie go brakuje lub zawiera samodzielną wartość null (nie w tablicy), dla dokumentu nie są generowane żadne klucze indeksu. Dlatego wiele dokumentów może mieć puste pola lub samodzielne wartości null bez wywoływania błędów zduplikowanych kluczy.
  • Elementy o wartości null w tablicy: jeśli tablica zawiera element o wartości null (np. ["news", null]), element null jest indeksowany. Każdy kolejny dokument zawierający element null w polu tablicy indeksowanej spowoduje błąd zduplikowanego klucza.

Indeksy TTL

Używaj indeksów TTL, aby automatycznie usuwać nieaktualne dane z baz danych. Indeks TTL wyznacza dane pole jako czas ważności dokumentów w danej kolekcji. Dzięki TTL możesz obniżyć koszty przechowywania danych, usuwając nieaktualne dane. Dane są zwykle usuwane w ciągu 24 godzin po upłynięciu ich daty ważności.

Rozwiązywanie problemów z błędami tworzenia indeksu

Podczas zarządzania indeksami mogą wystąpić błędy ich tworzenia. 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 limit indeksów nie został osiągnięty, spróbuj ponownie wykonać operację indeksowania.
  • Indeks wielokluczowy jest wymagany. 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 zindeksować wiele pól z wartościami tablicowymi. W indeksie wielokluczowym nie możesz mieć więcej niż 1 pola z wartością tablicową. Aby kontynuować, zmodyfikuj model danych lub definicje indeksów.
  • Ustawiono opcję unikalnego indeksu, a dane z indeksowanych pól utworzyłyby zduplikowane wpisy indeksu. Aby przejść dalej, usuń z danych zduplikowane kombinacje wartości.

Co dalej?