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 eftersex
først. Omvendt hvis du indekserede medname
, 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æthigh-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.