Wśród zadań związanych z zarządzaniem bazami danych jest poprawa wydajności poprzez zastosowanie różnych strategii. Indeksowanie to jedna z porad, które usprawniają operacje związane z przepustowością, ułatwiając dostęp do danych do żądań zapytań. Czyni to, minimalizując liczbę wymaganych dostępów do dysku podczas przetwarzania zapytania. Nieużycie indeksów w MongoDB zmusi bazę danych do wykonania pełnego skanowania kolekcji, czyli przeskanowania wszystkich dokumentów w kolekcji w celu wybrania dokumentów pasujących do wydanego zapytania. Oczywiście zajmie to dużo czasu, zwłaszcza jeśli w grę wchodzi tak wiele dokumentów. Krótko mówiąc, indeksy wspierają wydajne wykonywanie zapytań.
Indeksy MongoDB
Ponieważ spodziewamy się przechowywać wiele dokumentów w kolekcji MongoDB, musimy znaleźć sposób na przechowywanie małej porcji danych dla każdego dokumentu na innej partycji, aby ułatwić przechodzenie za pomocą indeksów. Indeks przechowuje określoną wartość lub pola, a następnie sortuje te dane w kolejności wartości tego pola. Dzięki tej kolejności obsługiwane jest wydajne dopasowywanie zapytań i operacje zapytań oparte na zakresach. Indeksy są definiowane na poziomie kolekcji i są obsługiwane przez dowolne pole lub pole osadzone dokumentów w kolekcji.
Podczas tworzenia dokumentu MongoDB domyślnie przypisuje pole _id, jeśli nie jest określone, i sprawia, że jest to unikalny indeks dla tego dokumentu. Zasadniczo ma to zapobiec wstawianiu tego samego dokumentu więcej niż jeden w tej kolekcji. Ponadto w przypadku klastra podzielonego na fragmenty zaleca się użycie tego pola _id jako części wyboru kluczy fragmentu, w przeciwnym razie musi istnieć pewna unikalność danych w polu _id, aby uniknąć błędów.
Tworzenie indeksu dla kolekcji
Zakładając, że wstawiłeś jakieś dane do swojej kolekcji i chcesz przypisać pole jako indeks, możesz użyć do tego metody createIndex, tj.
Załóżmy, że masz te dane json:
{
_id:1,
Name: “Sepp Maier”,
Country: “Germany”
}
Możemy zmienić w polu Nazwa indeks malejący:
db.collection.createIndex({Name: -1})
Ta metoda tworzy indeks o tej samej specyfikacji, jeśli jeszcze nie istnieje.
Typy indeksów w MongoDB
MongoDB obejmuje różne typy danych, stąd różne typy indeksów są tworzone w celu obsługi tych typów danych i zapytań.
-
Pojedyncze pole
Używając pojedynczego pola dokumentu można uczynić to pole indeksem rosnąco lub malejąco, tak jak w powyższym przykładzie. Poza tym możesz utworzyć indeks na osadzonym dokumencie jako całości, na przykład:
{ _id: “xyz”, Contact:{ email: “[email protected]”, phone:”+420 78342823” }, Name: “Sergio” }
Pole kontaktowe jest dokumentem osadzonym, dlatego możemy uczynić go indeksem rosnącym za pomocą polecenia:
db.collection.createIndex({ Contact: 1})
W zapytaniu możemy pobrać dokument taki jak:
db.collection.find({ Contact: {email: “[email protected]”, phone:”+420 78342823”} })
Najlepszą praktyką jest tworzenie indeksu w tle, zwłaszcza w przypadku dużej ilości danych, ponieważ aplikacja musi uzyskać dostęp do danych podczas budowania indeksu.
-
Indeks złożony
Indeksy złożone są często używane w celu ułatwienia operacji sortowania w zapytaniu i obsługi zapytań, które pasują do wielu pól. Składnia tworzenia indeksu złożonego to:
db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )
Tworzenie indeksu złożonego dla przykładowych danych poniżej
{ _id: “1”, Name: “Tom”, Age: 24, Score:”80” } db.collection.createIndex({ Age: 1, Score:-1})
Rozważania:
- Obsługiwany jest limit tylko 32 pól.
- Wartość pola określi typ indeksu, np. 1 rośnie, a -1 maleje.
- Nie twórz indeksów złożonych z haszowanym typem indeksu.
- Istotna jest kolejność pól wymienionych w indeksie złożonym. Sortowanie zostanie wykonane zgodnie z kolejnością pól.
-
Indeks wielokluczowy
W pewnym momencie możesz mieć pola z zapisaną zawartością tablicy. Podczas indeksowania tych pól tworzone są osobne wpisy indeksu dla każdego elementu. W związku z tym pomaga kwerendom wybrać dokumenty, które składają się z tablic, dopasowując je do elementu lub elementów tablic. Odbywa się to automatycznie przez MongoDB, więc nie ma potrzeby jawnego określania typu multikey. Od wersji 3.4 MongoDB śledzi, które pola indeksowane powodują, że indeks jest indeksem wielokluczowym. Dzięki temu śledzeniu silnik zapytań bazy danych może używać węższych granic indeksu.
Ograniczenia indeksu Multikey
- W indeksowaniu wielokluczowym dla dokumentu w kolekcji można użyć tylko jednego pola tablicy. Tj. Nie można utworzyć indeksu wielokluczowego dla polecenia i danych poniżej
Nie możesz utworzyć indeksu wielokluczowego{ _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
{ nums: 1, scores: 1 }
- Jeśli indeks wielokluczowy już istnieje, nie można wstawić dokumentu, który narusza to ograniczenie. Oznacza to, że mamy
Po utworzeniu złożonego indeksu wielokluczowego, próbie wstawienia dokumentu, w którym zarówno liczby, jak i pola wyników są tablicami, wstawienie bazy danych nie powiedzie się.{ _id: 1, nums: 1, scores: [ 30, 60 ]} { _id: 1, nums: [ 1, 2 ], scores: 30}
- W indeksowaniu wielokluczowym dla dokumentu w kolekcji można użyć tylko jednego pola tablicy. Tj. Nie można utworzyć indeksu wielokluczowego dla polecenia i danych poniżej
-
Indeksy tekstowe
Indeksy tekstowe są często używane do ulepszania zapytań wyszukiwania ciągu w kolekcji. Nie przechowują słów zatrzymania specyficznych dla języka (tj. „the”, „a”, „or”). Zbiór może mieć co najwyżej jeden indeks tekstowy. Aby utworzyć indeks tekstowy:
db.collection.createIndex({Name:”text”})
Możesz także indeksować wiele pól, np.
db.collection.createIndex({ Name:”text”, place:”text” })
Indeks złożony może zawierać klawisz indeksu tekstowego w połączeniu z klawiszem indeksu rosnąco/malejąco, ale:
- Wszystkie klucze indeksu tekstowego muszą sąsiadować ze sobą w dokumencie specyfikacji indeksu podczas tworzenia złożonego indeksu tekstowego.
- Żadne inne specjalne typy indeksów, takie jak wielokluczowe pola indeksowe, nie powinny być zaangażowane w złożony indeks tekstowy.
- Aby przeprowadzić wyszukiwanie $text, predykat zapytania musi zawierać warunki dopasowania równości w poprzednich kluczach.
-
Zaszyfrowane indeksy
Sharding to jedna z technik stosowanych w MongoDB w celu poprawy skalowania w poziomie. Sharding często wiąże się z koncepcją opartą na hashowaniu przy użyciu indeksów haszowanych. Bardziej losowy rozkład wartości w ich zakresie jest przedstawiany przez te indeksy, ale obsługuje tylko dopasowania równości i nie obsługuje zapytań opartych na zakresach.
Ogólne kwestie operacyjne dotyczące indeksów
- Każdy indeks wymaga co najmniej 8kB miejsca na dane.
- Gdy jest aktywny, każdy indeks będzie zajmował trochę miejsca na dysku i pamięci. Jest to istotne, gdy jest śledzone w planowaniu wydajności.
- Dla gromadzenia wysokiego współczynnika odczytu do zapisu, dodatkowe indeksy poprawiają wydajność i nie wpływają na operacje odczytu bez indeksowania.
Ograniczenia korzystania z indeksów
- Dodanie indeksu ma pewien negatywny wpływ na wydajność operacji zapisu, zwłaszcza w przypadku kolekcji o wysokim współczynniku zapisu do odczytu. Indeksy będą drogie, ponieważ każda wstawka musi również aktualizować dowolny indeks.
- MongoDB nie utworzy, nie zaktualizuje indeksu ani nie wstawi do indeksowanej kolekcji, jeśli wpis indeksu dla istniejącego dokumentu przekracza limit klucza indeksu.
- W przypadku istniejących kolekcji podzielonych na fragmenty, migracja porcji zakończy się niepowodzeniem, jeśli porcja zawiera dokument zawierający indeksowane pole z wpisem indeksu przekraczającym limit klucza indeksu.
Wniosek
Jest tak wiele sposobów na poprawę wydajności MongoDB, a jednym z nich jest indeksowanie. Indeksowanie ułatwia operacje zapytań, zmniejszając opóźnienia, przez które dane są pobierane, minimalizując w jakiś sposób liczbę dokumentów, które muszą zostać zeskanowane. Jednak przed podjęciem decyzji o zastosowaniu określonego rodzaju indeksu należy wziąć pod uwagę pewne kwestie. Kolekcje o wysokim współczynniku odczytu do zapisu zwykle wykorzystują indeksy lepiej niż kolekcje z wysokimi operacjami zapisu do odczytu.