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
sexa 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-cardinalitynebo zadejtehigh-cardinalityklíč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.
