Strategie di sharding ranged e hashed
I partecipanti configureranno una raccolta con sharding ranged per le query per intervallo o con sharding hashed per una distribuzione uniforme delle scritture e ne confronteranno i compromessi.
Strategie di sharding ranged e hashed è una lezione MongoDB Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento MongoDB Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso MongoDB Academy include 4 lezioni in totale.
Parti di questa lezione non sono ancora state tradotte e vengono mostrate in inglese.
Two Sharding Strategies Compared
MongoDB supports two built-in sharding strategies: ranged sharding and hashed sharding. Ranged sharding assigns contiguous ranges of shard key values to specific shards; hashed sharding applies a hash function to the key first and distributes based on the hash. Both have distinct strengths, and the right choice depends on your data access patterns.
Ranged Sharding: How It Works
In ranged sharding, MongoDB divides the shard key's value space into contiguous ranges and assigns each range (chunk) to a shard. For example, users with userId 1–10,000 go to shard A, 10,001–20,000 to shard B, and so on. Documents with nearby shard key values are co-located on the same shard, which is ideal for range queries.
// Enable ranged sharding on a field
sh.shardCollection('mydb.products', { category: 1, price: 1 })
// Range query is now targeted to the shard(s) holding that range
db.products.find({ category: 'electronics', price: { $lt: 100 } })Ranged Sharding: Strengths
Ranged sharding excels when your application frequently queries ranges of values: date ranges, price ranges, alphabetical name ranges, or paginated results sorted by a numeric ID. Because adjacent values are co-located, range queries become targeted queries that touch only one or a few shards, keeping latency low.
// With ranged sharding on { orderId: 1 }, this is targeted:
db.orders.find({
orderId: { $gte: 50000, $lte: 60000 }
})
// mongos knows exactly which shard owns this rangeRanged Sharding: Weakness — Hot Spots
The critical weakness of ranged sharding is write hot spots when the shard key is monotonically increasing (timestamps, auto-increment IDs, ObjectId). All new documents cluster at the high end of the range and land on one shard. Until the balancer migrates chunks, this shard absorbs all write traffic while other shards sit idle.
// Problematic: all new events go to the max-range shard
sh.shardCollection('mydb.events', { createdAt: 1 }) // ranged, monotonic = hot spot
// Production symptom: one shard has 90%+ of recent data
// and absorbs all write IOPSHashed Sharding: How It Works
In hashed sharding, MongoDB computes a hash of the shard key value and uses the hash to determine the chunk. Documents are distributed based on hash values, which appear random even if the original keys are monotonically increasing. This guarantees a near-uniform initial write distribution across all shards.
// Hashed sharding on _id (neutralizes ObjectId monotonicity)
sh.shardCollection('mydb.events', { _id: 'hashed' })
// Hashed sharding on userId
sh.shardCollection('mydb.sessions', { userId: 'hashed' })Hashed Sharding: Strengths
Hashed sharding is the best choice when your primary goal is uniform write distribution across shards and you do not need range queries on the shard key. It is ideal for high-insert-rate workloads with monotonic keys (event logs, IoT sensor data, messaging) where every shard should absorb an equal share of write traffic.
// With hashed sharding, inserts are spread uniformly:
// doc1 (hash: 2345...) -> shard A
// doc2 (hash: 8901...) -> shard C
// doc3 (hash: 4567...) -> shard B
// No hot spot regardless of insert orderHashed Sharding: Weakness — No Range Efficiency
The trade-off of hashed sharding is that range queries on the shard key become scatter-gather. Because adjacent hash values are scattered across shards, a query like { createdAt: { $gte: t1, $lte: t2 } } must fan out to all shards. If range queries are frequent and latency-sensitive, hashed sharding may negate the performance gains from sharding.
// With hashed sharding on createdAt:
// Range query CANNOT be targeted — fans out to all shards
db.events.find({ createdAt: { $gte: ISODate('2025-01-01'), $lte: ISODate('2025-02-01') } })
// Equivalent to a full collection scan across all shardsChoosing Between Ranged and Hashed
Decision guide: Ranged sharding → your shard key has natural distribution (not monotonic) AND your top queries are range queries on that key. Hashed sharding → your shard key is monotonic OR your top queries are point lookups (equality) on a high-cardinality field. When in doubt and inserts are the bottleneck, prefer hashed.
Hybrid: Compound Key With Hashed Component
You can combine both strategies with a compound shard key where the first field is ranged and gives query affinity, while adding a hashed second field spreads the load within each range. Example: { tenantId: 1, _id: 'hashed' } co-locates data by tenant for targeted queries while distributing writes across shards within each tenant.
// Ranged tenantId + hashed _id within tenant
// Writes are distributed; per-tenant queries are targeted
sh.shardCollection('mydb.events', { tenantId: 1, _id: 'hashed' })
// Targeted: all tenantId queries go to the right shard(s)
db.events.find({ tenantId: 'acme', _id: ObjectId('...') })Checking Which Strategy Is Active
You can inspect a collection's sharding configuration to determine which strategy is in use. The config server metadata stores the shard key and whether it uses 'hashed'. The sh.status() command and db.collection.stats() both expose this information.
// Check sharding info for a collection
use config
db.collections.findOne({ _id: 'mydb.events' })
// { key: { _id: 'hashed' }, unique: false, ... }
// Or via sh.status()
sh.status()Pre-Splitting Chunks for Bulk Loads
When bulk-loading data into a freshly sharded collection, all chunks initially live on one shard and must be migrated by the balancer — which can be slow. Pre-splitting creates an initial set of empty chunks distributed across all shards before loading. This ensures the balancer's work is minimised and writes are spread from the first insert.
// Pre-split chunks for ranged sharding
// Define desired split points and assign to shards
db.adminCommand({ split: 'mydb.events', middle: { userId: 500000 } })
db.adminCommand({ moveChunk: 'mydb.events',
find: { userId: 500000 }, to: 'shard02' })Quick Check
Test your understanding of MongoDB & NoSQL Databases concepts from this lesson.
Lesson Recap
In this lesson you learned: ranged sharding co-locates similar key values for efficient range queries but creates hot spots with monotonic keys, hashed sharding distributes uniformly across shards but makes range queries scatter-gather, and compound keys can combine both benefits. Next up we explore zone sharding for pinning data to specific regions.
Impara JavaScript con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Strategie di sharding ranged e hashed» è gratuita?
Sì — il testo completo di «Strategie di sharding ranged e hashed» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso MongoDB Academy, passa a CoddyKit PRO. Il corso MongoDB Academy include 4 lezioni in totale.
Cosa imparerò in «Strategie di sharding ranged e hashed»?
I partecipanti configureranno una raccolta con sharding ranged per le query per intervallo o con sharding hashed per una distribuzione uniforme delle scritture e ne confronteranno i compromessi. Eserciti MongoDB Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare MongoDB Academy?
Non è richiesta alcuna esperienza precedente. MongoDB Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Strategie di sharding ranged e hashed»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione MongoDB Academy?
Sì. Ogni lezione MongoDB Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Concetti dello sharding: chunk, bilanciatore e shard key
- Scegliere una shard key: cardinalità, frequenza, monotonicità
- Strategie di sharding ranged e hashed
- Sharding per zone: assegnare i dati alle regioni