Редсандро,
Трябва да вземете предвид 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}
тъй като префиксът ще ви служи много по-добре при използването на съставни индекси. Има още много неща, които могат да се прочетат по темата, надявам се това да внесе известна яснота.