sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur spelar ordningen på sammansatta index roll i MongoDB prestandamässigt?

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 med sex först. Omvänt om du indexerade med name , 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ätt high-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.



  1. Hur behåller jag has_many :through-relationer när jag serialiserar till JSON och tillbaka i Rails 4.0.3?

  2. Hur använder man Mongoose utan att definiera ett schema?

  3. Använda Redis Sets

  4. MongoDB-lösning för dokument över 16 MB?