sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvilken betydning har rækkefølgen af ​​sammensatte indekser i MongoDB præstationsmæssigt?

Redsandro,

Du skal overveje Index Cardinality og Selectivity .

1. Indekskardinalitet

Indekskardinaliteten refererer til, hvor mange mulige værdier der er for et felt. Feltet sex har kun to mulige værdier. Den har en meget lav kardinalitet . Andre felter såsom names, usernames, phone numbers, emails , osv. vil have en mere unik værdi for hvert dokument i samlingen, hvilket anses for at være høj kardinalitet .

  • Større kardinalitet

    Jo større kardinalitet et felt er, jo mere nyttigt vil et indeks være, fordi indekser indsnævrer søgeområdet, hvilket gør det til et meget mindre sæt.

    Hvis du har et indeks på sex og du leder efter mænd ved navn John. Du ville kun indsnævre resultatrummet med ca. %50, hvis du indekserede efter sex først. Omvendt hvis du indekserede med name , ville du med det samme indsnævre resultatsættet til en lille brøkdel af brugere ved navn John, så ville du henvise til disse dokumenter for at kontrollere kønnet.

  • Tommelfingerregel

    Prøv at oprette indekser på high-cardinality nøgler eller sæt high-cardinality nøgler først i det sammensatte indeks. Du kan læse mere om det i afsnittet om sammensatte indekser i bogen:

    MongoDB The Definitive Guide

2. Selektivitet

Du vil også bruge indekser selektivt og skrive forespørgsler, der begrænser antallet af mulige dokumenter med det indekserede felt. For at holde det enkelt, overvej følgende samling. Hvis dit indeks er {name:1} , Hvis du kører forespørgslen { name: "John", sex: "male"} . Du bliver nødt til at scanne 1 dokument. Fordi du tillod MongoDB at være selektiv.

{_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"}
 

Overvej følgende samling. Hvis dit indeks er {sex:1} , Hvis du kører forespørgslen {sex: "male", name: "John"} . Du bliver nødt til at scanne 4 dokumenter.

{_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"}
 

Forestil dig de mulige forskelle på et større datasæt.

En lille forklaring af sammensatte indekser

Det er nemt at gøre en forkert antagelse om sammensatte indekser. Ifølge MongoDB-dokumenter om sammensatte indekser.

MongoDB understøtter sammensatte indekser, hvor en enkelt indeksstruktur indeholder referencer til flere felter i en samlings dokumenter. Følgende diagram illustrerer et eksempel på et sammensat indeks over to felter:

Når du opretter et sammensat indeks, 1 indeks vil indeholde flere felter. Så hvis vi indekserer en samling efter {"sex" : 1, "name" : 1} , vil indekset se nogenlunde sådan ud:

["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

Hvis vi indekserer en samling efter {"name" : 1, "sex" : 1} , vil indekset se nogenlunde sådan ud:

["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
 

Med {name:1} da præfikset vil tjene dig meget bedre ved brug af sammensatte indekser. Der er meget mere, der kan læses om emnet, jeg håber, at dette kan give lidt klarhed.



  1. Stop Mongoose i at oprette _id-egenskaber for underdokumentarray-elementer

  2. Bulk upsert i MongoDB ved hjælp af mongoose

  3. MongoDB indsætter float, når man forsøger at indsætte heltal

  4. RuntimeError:-ERR Ukendt kommando, der kører redis gem på Ruby