Редсандро,
Трябва да вземете предвид Index Cardinality и Selectivity .
1. Кардиналност на индекса
Кардиналността на индекса се отнася до това колко възможни стойности има за поле. Полето sex има само две възможни стойности. Има много ниска кардиналност . Други полета като names, usernames, phone numbers, emails , и т.н. ще има по-уникална стойност за всеки документ в колекцията, което се счита за висока мощност .
-
По-голяма кардиналност
Колкото по-голяма е мощността на полето, толкова по-полезен ще бъде индексът, тъй като индексите стесняват пространството за търсене, което го прави много по-малък набор.
Ако имате индекс за
sexи търсите мъже на име Джон. Ще стесните пространството за резултати само с приблизително %50, ако индексирате поsexпърво. Обратно, ако сте индексирали поname, веднага ще стесните набора от резултати до минута от потребители на име John, след което ще се обърнете към тези документи, за да проверите пола. -
Правило на палеца
Опитайте се да създадете индекси на
high-cardinalityключове или поставетеhigh-cardinalityключове първи в съставния индекс. Можете да прочетете повече за това в раздела за съставни индекси в книгата:Окончателното ръководство за MongoDB
2. Селективност
Освен това искате да използвате индекси избирателно и да пишете заявки, които ограничават броя на възможните документи с индексираното поле. За да бъде просто, помислете за следната колекция. Ако вашият индекс е {name:1} , Ако изпълните заявката { name: "John", sex: "male"} . Ще трябва да сканирате 1 документ. Защото позволихте на MongoDB да бъде селективен.
{_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"}
Помислете за следната колекция. Ако вашият индекс е {sex:1} , Ако изпълните заявката {sex: "male", name: "John"} . Ще трябва да сканирате 4 документи.
{_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"}
Представете си възможните разлики при по-голям набор от данни.
Малко обяснение на сложните индекси
Лесно е да се направи погрешно предположение за съставните индекси. Според MongoDB документи за сложни индекси.
MongoDB поддържа съставни индекси, където структура на единичен индекс съдържа препратки към множество полета в документите на колекция. Следната диаграма илюстрира пример за комбиниран индекс в две полета:
Когато създавате комбиниран индекс, 1 индекс ще съдържа множество полета. Така че, ако индексираме колекция по {"sex" : 1, "name" : 1} , индексът ще изглежда приблизително така:
["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
Ако индексираме колекция по {"name" : 1, "sex" : 1} , индексът ще изглежда приблизително така:
["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
Имате {name:1} тъй като префиксът ще ви служи много по-добре при използването на съставни индекси. Има още много неща, които могат да се прочетат по темата, надявам се това да внесе известна яснота.
