Redsandro,
Musíte vzít v úvahu Index Cardinality
a Selectivity
.
1. Index kardinality
Kardinalita indexu se týká počtu možných hodnot pro pole. Pole sex
má pouze dvě možné hodnoty. Má velmi nízkou mohutnost . Další pole, jako jsou names, usernames, phone numbers, emails
, atd. bude mít pro každý dokument ve sbírce unikátnější hodnotu, což je považováno za vysokou mohutnost .
-
Větší mohutnost
Čím větší je mohutnost pole, tím užitečnější bude index, protože indexy zužují prostor pro vyhledávání, takže je mnohem menší.
Pokud máte index na
sex
a hledáte muže jménem John. Pokud byste indexovali podlesex
, výsledný prostor byste zúžili pouze přibližně o %50 za prvé. A naopak, pokud jste indexovali podlename
, okamžitě byste zúžili sadu výsledků na nepatrný zlomek uživatelů jménem John, pak byste se na tyto dokumenty odkázali a zkontrolovali pohlaví. -
Pravidlo palce
Zkuste vytvořit indexy na
high-cardinality
nebo zadejtehigh-cardinality
klíče první ve složeném indexu. Více si o tom můžete přečíst v části o složených rejstřících v knize:MongoDB The Definitive Guide
2. Selektivita
Také chcete používat indexy selektivně a psát dotazy, které omezují počet možných dokumentů s indexovaným polem. Aby to nebylo jednoduché, zvažte následující kolekci. Pokud je váš index {name:1}
, Pokud spustíte dotaz { name: "John", sex: "male"}
. Budete muset naskenovat 1
dokument. Protože jste dovolili MongoDB být selektivní.
{_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"}
Zvažte následující sbírku. Pokud je váš index {sex:1}
, Pokud spustíte dotaz {sex: "male", name: "John"}
. Budete muset naskenovat 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"}
Představte si možné rozdíly na větším souboru dat.
Malé vysvětlení složených indexů
Je snadné vytvořit nesprávný předpoklad o složených indexech. Podle dokumentů MongoDB o složených indexech.
MongoDB podporuje složené indexy, kde je struktura jediného indexu obsahuje odkazy na více polí v dokumentech kolekce. Následující diagram ilustruje příklad složeného indexu ve dvou polích:
Když vytvoříte složený index, 1 index bude obsahovat více polí. Pokud tedy indexujeme kolekci podle {"sex" : 1, "name" : 1}
, index bude vypadat zhruba takto:
["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
Pokud indexujeme kolekci podle {"name" : 1, "sex" : 1}
, index bude vypadat zhruba takto:
["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
S {name:1}
protože Prefix vám mnohem lépe poslouží při používání složených indexů. Je toho mnohem více, co si lze přečíst na toto téma, doufám, že to může nabídnout trochu jasnosti.