Valg af shard key: kardinalitet, frekvens og monotonitet
De lærende vil evaluere kandidater til shard key ud fra de tre dimensioner – kardinalitet, skrivefordeling og målretning af forespørgsler – og undgå anti-mønstre med overbelastede shards.
Valg af shard key: kardinalitet, frekvens og monotonitet er en gratis MongoDB Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i MongoDB Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. MongoDB Academy-kurset indeholder 4 lektioner i alt.
Hvorfor valget af shard-nøgle er afgørende
Shard-nøglen er uforanderlig, når den først er angivet, og kan ikke ændres uden at ophæve sharding og sharde hele samlingen igen — en dyr og forstyrrende operation. Hvis du vælger den forkerte shard-nøgle, fører det til varme shards, dårlig forespørgselsrouting og spildt hardware. Du skal vurdere kandidater ud fra tre dimensioner: kardinalitet, frekvens og monotonicitet.
Kardinalitet: Hvor mange forskellige værdier?
Kardinalitet er antallet af forskellige værdier, som shard-nøglen kan antage. Høj kardinalitet (f.eks. userId, email, orderId) er godt — det giver MongoDB mange mulige chunk-grænser og lader balanceren fordele data fint. Lav kardinalitet (f.eks. status: 'active' | 'inactive' og country med 50 værdier) skaber jumbo-chunks, som ikke kan opdeles eller migreres.
// HIGH cardinality — good shard key
sh.shardCollection('mydb.users', { userId: 1 })
// LOW cardinality — avoid: only 2 chunk boundaries possible
sh.shardCollection('mydb.users', { status: 1 }) // BADFrekvens: Hvor jævnt er værdierne fordelt?
Frekvens måler, hvor mange dokumenter der deler hver shard-nøgleværdi. Selv nøgler med høj kardinalitet kan give problemer, hvis et lille antal værdier forekommer i langt størstedelen af dokumenterne. Et felt som countryCode kan for eksempel have 200 forskellige værdier, men 90 % af brugerne kan komme fra ét enkelt land — hvilket skaber en massiv varm chunk, der ikke kan opdeles.
// Estimate frequency distribution before choosing
db.users.aggregate([
{ $group: { _id: '$countryCode', count: { $sum: 1 } } },
{ $sort: { count: -1 } },
{ $limit: 10 }
])
// If top 1 value has 80%+ of docs, this is a bad shard keyMonotonicitet: Stiger værdierne altid?
Monotonicitet handler om, hvorvidt shard-nøgleværdier altid stiger (eller falder) over tid. Felter som tidsstempler i createdAt og ObjectId (_id) stiger monotonisk. Det er problematisk, fordi alle nye indsættelser lander i den samme 'maksimale' chunk på én shard, hvilket skaber et varmt skrivepunkt, selv når data historisk set er jævnt fordelt.
// Monotonic keys cause write hot spots
// All new orders go to the shard with the latest date range
sh.shardCollection('mydb.orders', { createdAt: 1 }) // BAD for high insert rate
// Fix: use hashed sharding to spread monotonic keys
sh.shardCollection('mydb.orders', { createdAt: 'hashed' })Opsummering af egenskaber for den ideelle shard-nøgle
Den ideelle shard-nøgle har: Høj kardinalitet — tusinder eller millioner af forskellige værdier. Lav skævhed i frekvensen — ingen enkelt værdi dominerer. Ikke-monotonisk fordeling — værdierne stiger ikke altid, eller også bruger du hashed sharding. Tilpasning til forespørgsler — den matcher filtrene i dine hyppigste forespørgsler, hvor latenstid er vigtig, så routingen kan målrettes.
Sammensatte shard-nøgler
En sammensat shard-nøgle kombinerer to felter for at opnå en bedre fordeling. For eksempel fordeler { tenantId: 1, createdAt: 1 } data på tværs af tenants (høj kardinalitet) og tillader intervalforespørgsler inden for hver tenant. Det første felt bestemmer den overordnede fordeling, mens det andet giver mulighed for finopdeling. Sammensatte nøgler kan opfylde forespørgselsprædikater med flere felter som målrettede forespørgsler.
// Compound shard key: tenant + date
sh.shardCollection('mydb.events', { tenantId: 1, createdAt: 1 })
// This query is fully targeted (both shard key fields present)
db.events.find({ tenantId: 't123', createdAt: { $gte: ISODate('2025-01-01') } })Hashede shard-nøgler
En hashed shard-nøgle anvender en hashfunktion på feltets værdi, før den knytter værdien til en chunk. Det omdanner monotone nøgler (f.eks. ObjectId) til tilfældigt fordelte hashværdier og fjerner varme skrivepunkter. Ulempen er, at intervalforespørgsler på feltet bliver til scatter-gather-forespørgsler, fordi hashværdierne ikke gemmes i den oprindelige rækkefølge.
// Hashed sharding: uniform write distribution
sh.shardCollection('mydb.events', { _id: 'hashed' })
// Range query on _id is now scatter-gather (con)
// But all inserts are evenly distributed (pro)Zone-sharding til geografisk fordeling
MongoDB giver mulighed for zone-sharding, hvor du tildeler shard-nøgleintervaller til bestemte shards ved hjælp af tags (zoner). Det er nyttigt til krav om dataplacering: Europæiske brugerdata kan bindes til shards i EU-regionen, og amerikanske data til shards i USA. Zone-sharding kræver en sammensat shard-nøgle med et regionspræfiks som første komponent.
// Tag shards with zones
sh.addShardTag('shard01', 'EU')
sh.addShardTag('shard02', 'US')
// Assign key ranges to zones
sh.addTagRange('mydb.users',
{ region: 'EU', userId: MinKey },
{ region: 'EU', userId: MaxKey },
'EU'
)Vurdering af kandidater: En praktisk tjekliste
Når du vurderer kandidater til shard-nøgler: 1) Kør et kardinalitetstjek — db.col.distinct('field').length bør være i tusindvis eller mere. 2) Kontrollér frekvensfordelingen med en aggregering. 3) Afgør, om feltet er monotont (tidsstempler, automatisk inkrementering). 4) Gennemgå dine 5 hyppigste forespørgsler — optræder kandidatfeltet i deres filter?
// Quick cardinality check
db.events.distinct('userId').length // want > 10,000+
// Frequency check — any value > 1% of docs is a risk
const total = db.events.countDocuments()
db.events.aggregate([
{ $group: { _id: '$userId', n: { $sum: 1 } } },
{ $match: { n: { $gt: total * 0.01 } } }
])Feltet _id som hashed shard-nøgle
En almindelig og sikker standardløsning til mange arbejdsbelastninger er at bruge { _id: 'hashed' }. MongoDB ObjectId-værdier bliver, selv om de er monotone, jævnt fordelt efter hashing. Det giver en ensartet skrivefordeling med det samme. Den største begrænsning er, at alle intervalforespørgsler på _id bliver til scatter-gather-forespørgsler — men for de fleste opslag af dokumenter er det acceptabelt.
// Safe default for write-heavy workloads without range queries
sh.shardCollection('mydb.messages', { _id: 'hashed' })
// Single-document lookup by _id is still targeted
// (hash is deterministic: mongos knows which shard)
db.messages.findOne({ _id: ObjectId('...') })Valg af shard-nøgle i Atlas
MongoDB Atlas indeholder en Shard Key Advisor i Performance Advisor, som analyserer dine forespørgselsmønstre og anbefaler shard-nøgler baseret på den faktiske brug. Den kan registrere monotone nøgler, skæv frekvensfordeling og manglende indekser. Det er især nyttigt at bruge rådgiveren før sharding i produktionsarbejdsbelastninger, hvor forespørgselsmønstrene allerede er etableret.
Hurtigt tjek
Test din forståelse af begreberne MongoDB og NoSQL-databaser fra denne lektion.
Opsummering af lektionen
I denne lektion har du lært, at en god shard-nøgle har høj kardinalitet, lav skævhed i frekvensen og undgår monotone værdier, at sammensatte shard-nøgler kombinerer dækning til fordeling og målretning af forespørgsler, og at hashed sharding neutraliserer varme punkter fra monotone nøgler på bekostning af effektiviteten ved intervalforespørgsler. Som det næste sammenligner vi strategierne ranged sharding og hashed sharding i detaljer.
Lær JavaScript med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “Valg af shard key: kardinalitet, frekvens og monotonitet” gratis?
Ja — hele teksten til “Valg af shard key: kardinalitet, frekvens og monotonitet” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af MongoDB Academy-kurset, skal du opgradere til CoddyKit PRO. MongoDB Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Valg af shard key: kardinalitet, frekvens og monotonitet”?
De lærende vil evaluere kandidater til shard key ud fra de tre dimensioner – kardinalitet, skrivefordeling og målretning af forespørgsler – og undgå anti-mønstre med overbelastede shards. Du øver dig i MongoDB Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på MongoDB Academy?
Der kræves ingen tidligere erfaring. MongoDB Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Valg af shard key: kardinalitet, frekvens og monotonitet”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne MongoDB Academy-lektion?
Ja. Alle MongoDB Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Shardingkoncepter: chunks, balancer og shard keys
- Valg af shard key: kardinalitet, frekvens og monotonitet
- Rangeret kontra hash-baseret sharding
- Zonesharding: Binding af data til regioner