Redsandro,
Du måste överväga Index Cardinality
och Selectivity
.
1. Indexkardinalitet
Indexkardinaliteten hänvisar till hur många möjliga värden det finns för ett fält. Fältet sex
har bara två möjliga värden. Den har en mycket låg kardinalitet . Andra fält som names, usernames, phone numbers, emails
, etc. kommer att ha ett mer unikt värde för varje dokument i samlingen, vilket anses vara hög kardinalitet .
-
Större kardinalitet
Ju större kardinalitet ett fält har, desto mer användbart kommer ett index att vara, eftersom index begränsar sökutrymmet, vilket gör det till en mycket mindre uppsättning.
Om du har ett index på
sex
och du letar efter män som heter John. Du skulle bara minska resultatutrymmet med cirka %50 om du indexerade medsex
först. Omvänt om du indexerade medname
, skulle du omedelbart begränsa resultatet till en bråkdel av användare som heter John, sedan skulle du hänvisa till dessa dokument för att kontrollera könet. -
Tumregel
Försök att skapa index på
high-cardinality
nycklar eller sätthigh-cardinality
nycklar först i det sammansatta indexet. Du kan läsa mer om det i avsnittet om sammansatta index i boken:MongoDB The Definitive Guide
2. Selektivitet
Du vill också använda index selektivt och skriva frågor som begränsar antalet möjliga dokument med det indexerade fältet. För att göra det enkelt, överväg följande samling. Om ditt index är {name:1}
, Om du kör frågan { name: "John", sex: "male"}
. Du måste skanna 1
dokumentera. Eftersom du tillät MongoDB att vara 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"}
Tänk på följande samling. Om ditt index är {sex:1}
, Om du kör frågan {sex: "male", name: "John"}
. Du måste skanna 4
dokument.
{_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"}
Föreställ dig de möjliga skillnaderna på en större datamängd.
En liten förklaring av sammansatta index
Det är lätt att göra fel antagande om sammansatta index. Enligt MongoDB-dokument om sammansatta index.
MongoDB stöder sammansatta index, där en enda indexstruktur innehåller referenser till flera fält i en samlings dokument. Följande diagram illustrerar ett exempel på ett sammansatt index över två fält:
När du skapar ett sammansatt index, 1 index kommer att innehålla flera fält. Så om vi indexerar en samling med {"sex" : 1, "name" : 1}
, kommer indexet att se ungefär ut så här:
["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
Om vi indexerar en samling med {"name" : 1, "sex" : 1}
, kommer indexet att se ungefär ut så här:
["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
Att ha {name:1}
eftersom prefixet kommer att hjälpa dig mycket bättre när du använder sammansatta index. Det finns mycket mer att läsa om ämnet, jag hoppas att detta kan ge lite klarhet.