sql >> Database >  >> NoSQL >> MongoDB

Hoe is de volgorde van samengestelde indexen van belang in MongoDB-prestaties?

Redsandro,

U moet rekening houden met Index Cardinality en Selectivity .

1. Indexkardinaliteit

De indexkardinaliteit verwijst naar het aantal mogelijke waarden voor een veld. Het veld sex heeft slechts twee mogelijke waarden. Het heeft een zeer lage kardinaliteit . Andere velden zoals names, usernames, phone numbers, emails , enz. zal een meer unieke waarde hebben voor elk document in de verzameling, wat wordt beschouwd als hoge kardinaliteit .

  • Grotere kardinaliteit

    Hoe groter de kardinaliteit van een veld, hoe nuttiger een index zal zijn, omdat indexen de zoekruimte verkleinen, waardoor het een veel kleinere set wordt.

    Als je een index hebt op sex en je zoekt mannen met de naam John. U zou de resultaatruimte slechts met ongeveer %50 verkleinen als u indexeert op sex eerst. Omgekeerd als je geïndexeerd hebt op name , zou u de resultatenset onmiddellijk beperken tot een klein deel van de gebruikers met de naam John, en vervolgens naar die documenten verwijzen om het geslacht te controleren.

  • Vuistregel

    Probeer indexen te maken op high-cardinality sleutels of plaats high-cardinality sleutels eerst in de samengestelde index. U kunt er meer over lezen in het gedeelte over samengestelde indexen in het boek:

    MongoDB de definitieve gids

2. Selectiviteit

U wilt ook selectief gebruik maken van indexen en query's schrijven die het aantal mogelijke documenten met het geïndexeerde veld beperken. Om het simpel te houden, overweeg dan de volgende verzameling. Als uw index {name:1} . is , Als u de zoekopdracht { name: "John", sex: "male"} . uitvoert . U moet 1 . scannen document. Omdat je MongoDB selectief hebt laten zijn.

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

Beschouw de volgende verzameling. Als uw index {sex:1} . is , Als u de zoekopdracht {sex: "male", name: "John"} . uitvoert . U moet 4 . scannen documenten.

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

Stel je de mogelijke verschillen voor op een grotere dataset.

Een kleine uitleg van samengestelde indexen

Het is gemakkelijk om de verkeerde veronderstelling te maken over samengestelde indexen. Volgens MongoDB-documenten over samengestelde indexen.

MongoDB ondersteunt samengestelde indexen, waarbij een enkele indexstructuur bevat verwijzingen naar meerdere velden binnen de documenten van een collectie. Het volgende diagram illustreert een voorbeeld van een samengestelde index op twee velden:

Wanneer u een samengestelde index maakt, 1 Index zal meerdere velden bevatten. Dus als we een collectie indexeren op {"sex" : 1, "name" : 1} , ziet de index er ongeveer zo uit:

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

Als we een collectie indexeren op {"name" : 1, "sex" : 1} , ziet de index er ongeveer zo uit:

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

Met {name:1} omdat het voorvoegsel u veel beter van dienst zal zijn bij het gebruik van samengestelde indexen. Er is veel meer te lezen over dit onderwerp, ik hoop dat dit wat duidelijkheid kan bieden.



  1. MongoDB implementeren met Docker

  2. Wat betekent *((char*)-1) ='x'-code?

  3. Spring Boot en hoe verbindingsdetails met MongoDB te configureren?

  4. Redis Async API's