MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как е важен редът на съставните индекси в MongoDB по отношение на производителността?

Редсандро,

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $lookup Objectid получава празен масив?

  2. Проблем с инсталирането на драйвер на PHP MongoDb на wamp

  3. Съвети за надграждане до най-новата версия на MongoDB

  4. MongoDb Aggregation:Как мога да групирам масив-1 въз основа на друг масив-2, когато са дадени масив-1 и масив-2?

  5. Планиране и управление на схеми в MongoDB (дори въпреки че е безсхемно)