MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jakie znaczenie ma kolejność indeksów złożonych w MongoDB pod względem wydajności?

Redsandro,

Musisz wziąć pod uwagę Index Cardinality i Selectivity .

1. Liczność indeksu

Kardynalność indeksu odnosi się do liczby możliwych wartości dla pola. Pole sex ma tylko dwie możliwe wartości. Ma bardzo niską kardynalność . Inne pola, takie jak names, usernames, phone numbers, emails itp. będą miały bardziej unikalną wartość dla każdego dokumentu w kolekcji, co jest uważane za wysoką kardynalność .

  • Większa kardynalność

    Im większa kardynalność pola, tym bardziej pomocny będzie indeks, ponieważ indeksy zawężają przestrzeń wyszukiwania, czyniąc ją znacznie mniejszym zbiorem.

    Jeśli masz indeks dotyczący sex a ty szukasz mężczyzn o imieniu Jan. Przestrzeń wyników zawęzisz tylko o około %50, jeśli indeksujesz według sex pierwszy. I odwrotnie, jeśli indeksujesz według name , od razu zawęzisz zestaw wyników do minimalnego ułamka użytkowników o imieniu Jan, a następnie odniesiesz się do tych dokumentów, aby sprawdzić płeć.

  • Zasada kciuka

    Spróbuj utworzyć indeksy na high-cardinality klawisze lub wstaw high-cardinality klucze najpierw w indeksie złożonym. Więcej na ten temat możesz przeczytać w rozdziale poświęconym indeksom złożonym w książce:

    MongoDB Przewodnik ostateczny

2. Selektywność

Ponadto chcesz używać indeksów wybiórczo i pisać zapytania, które ograniczają liczbę możliwych dokumentów z indeksowanym polem. Aby to uprościć, rozważ następującą kolekcję. Jeśli Twój indeks to {name:1} , Jeśli uruchomisz zapytanie { name: "John", sex: "male"} . Będziesz musiał zeskanować 1 dokument. Ponieważ pozwoliłeś MongoDB na selektywność.

{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}

Rozważ następującą kolekcję. Jeśli Twój indeks to {sex:1} , Jeśli uruchomisz zapytanie {sex: "male", name: "John"} . Będziesz musiał zeskanować 4 dokumenty.

{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}

Wyobraź sobie możliwe różnice w większym zestawie danych.

Krótkie wyjaśnienie indeksów złożonych

Łatwo jest popełnić błędne założenie dotyczące indeksów złożonych. Według dokumentów MongoDB dotyczących indeksów złożonych.

MongoDB obsługuje indeksy złożone, gdzie struktura pojedynczego indeksu zawiera odniesienia do wielu pól w dokumentach kolekcji. Poniższy diagram ilustruje przykład złożonego indeksu na dwóch polach:

Podczas tworzenia indeksu złożonego 1 indeks będzie zawierać wiele pól. Więc jeśli indeksujemy kolekcję według {"sex" : 1, "name" : 1} , indeks będzie wyglądał mniej więcej tak:

["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103

Jeśli indeksujemy kolekcję według {"name" : 1, "sex" : 1} , indeks będzie wyglądał mniej więcej tak:

["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103

Posiadanie {name:1} ponieważ Prefiks będzie Ci znacznie lepiej służył w używaniu indeksów złożonych. Na ten temat można przeczytać o wiele więcej, mam nadzieję, że da to trochę jasności.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Nie można połączyć się z MongoDB Atlas (queryTxt ETIMEOUT)

  2. Konkretny miesiąc zapytania Mongodb | rok nie data

  3. Python i MongoDB:łączenie się z bazami danych NoSQL

  4. Globalnie używaj JsonConverter w klasie bez atrybutu

  5. Jak logować zapytania wykonywane przez Spring Data MongoDB?