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ługsex
pierwszy. I odwrotnie, jeśli indeksujesz wedługname
, 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 wstawhigh-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.