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 opsex
eerst. Omgekeerd als je geïndexeerd hebt opname
, 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 plaatshigh-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.