Naast scalaire indexen (oplopend, aflopend), ondersteunt MongoDB ook 'gehashte' indexen. Wanneer u een gehashte index op een veld gebruikt, berekent MongoDB een hash van de veldwaarde en slaat de hash op in de index. Gehashte indexen ondersteunen alleen gelijkheidsvergelijking en ondersteunen geen bereikquery's, en worden meestal gebruikt in shardingscenario's.
Een MongoDB gehashte index maken
U kunt de volgende syntaxis gebruiken om een gehashte index te maken:
db.collection.ensureIndex({'field':'hashed'});
U kunt op hetzelfde veld zowel een scalaire index als een gehashte index maken.
MongoDB-sharding
Meestal wordt MongoDB-sharding geïmplementeerd met behulp van 'range-based' partitionering. In deze benadering wordt aan elke Shard een reeks waarden van de Shard-sleutel toegewezen. Als de shardsleutel monotoon toeneemt, zoals tijdstempels of object-ID, kan dit soms resulteren in een 'hot' shard omdat de meest recente waarden altijd naar dezelfde shard worden gerouteerd.
De manier om dit te omzeilen is door ‘op hash gebaseerde partitionering’ te gebruiken. Er wordt een hash van de shard-sleutel berekend en deze hash-waarde wordt gebruikt om naar een shard te routeren in plaats van de werkelijke waarde. Dit helpt om de belasting gelijkmatig over alle shards te verdelen in plaats van alle nieuwste gegevens naar dezelfde shard te sturen. Op hash gebaseerde partitionering wordt geïmplementeerd met behulp van gehashte indexen op uw shard-sleutel. Raadpleeg de sharding-documentatie voor meer informatie.
Voor- en nadelen gehashte index
-
Pluspunten
Gehashte indexen zijn meestal kleiner dan de scalaire indexen omdat alleen een hash van de sleutel wordt opgeslagen in plaats van de volledige sleutel. bijv. In een eenvoudige test met 100.000 documenten hebben we gehashte en scalaire indexen toegevoegd aan een stringveld - 'fieldName'. Zoals hieronder wordt getoond, is de gehashte index meestal aanzienlijk kleiner dan de scalaire indexen:
"indexSizes" : { "_id_" : 811008, "firstName_1" : 4415488, "firstName_hashed" : 1490944 }
-
Nadelen
Ondersteunt geen bereikquery's. Als u een bereikquery uitvoert op een gehashte index, resulteert dit in een indexscan.
Gehashte indexbeperkingen
- Gehashte indexen ondersteunen geen arrays.
- Gehashed indexen kunnen geen samengestelde indexen zijn.
- U kunt geen unieke beperkingen toevoegen aan gehashte indexen.