sql >> Databáze >  >> NoSQL >> MongoDB

Jak záleží na pořadí složených indexů ve výkonu MongoDB?

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 podle sex, výsledný prostor byste zúžili pouze přibližně o %50 za prvé. A naopak, pokud jste indexovali podle name , 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 zadejte high-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.



  1. odeslat downstream zprávu do Google ccs s node js

  2. Zdokonalování umění automatizace a správy nejoblíbenějších databází s otevřeným zdrojovým kódem:2017 @ Somenines

  3. MongoDB $dateFromParts

  4. Představujeme zásady komprimačních oddílů Apache HBase Medium Object Storage (MOB).