Estrategias de sharding por rangos frente a hash
Configurará una colección con sharding por rangos para consultas de rango o con sharding por hash para una distribución uniforme de escrituras, y comparará sus ventajas y desventajas.
Estrategias de sharding por rangos frente a hash es una lección gratuita de MongoDB Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de MongoDB Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de MongoDB Academy incluye 4 lecciones en total.
Comparación de dos estrategias de fragmentación
MongoDB admite dos estrategias de fragmentación integradas: fragmentación por rangos y fragmentación hash. La fragmentación por rangos asigna rangos contiguos de valores de la clave de fragmentación a fragmentos específicos; la fragmentación hash aplica primero una función hash a la clave y distribuye los datos según el hash. Ambas tienen ventajas distintas, y la elección adecuada depende de sus patrones de acceso a los datos.
Fragmentación por rangos: cómo funciona
En la fragmentación por rangos, MongoDB divide el espacio de valores de la clave de fragmentación en rangos contiguos y asigna cada rango (bloque) a un fragmento. Por ejemplo, los usuarios con userId del 1 al 10.000 van al fragmento A, los del 10.001 al 20.000 al fragmento B, y así sucesivamente. Los documentos con valores cercanos de la clave de fragmentación se ubican conjuntamente en el mismo fragmento, lo que resulta ideal para las consultas por rangos.
// 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 } })Fragmentación por rangos: ventajas
La fragmentación por rangos destaca cuando su aplicación consulta con frecuencia rangos de valores: rangos de fechas, rangos de precios, rangos alfabéticos de nombres o resultados paginados ordenados por un ID numérico. Como los valores adyacentes se ubican conjuntamente, las consultas por rangos se convierten en consultas dirigidas que solo acceden a uno o unos pocos fragmentos, manteniendo una latencia baja.
// With ranged sharding on { orderId: 1 }, this is targeted:
db.orders.find({
orderId: { $gte: 50000, $lte: 60000 }
})
// mongos knows exactly which shard owns this rangeFragmentación por rangos: desventaja — puntos calientes
La principal desventaja de la fragmentación por rangos son los puntos calientes de escritura cuando la clave de fragmentación aumenta monótonamente (marcas de tiempo, ID autoincrementales, ObjectId). Todos los documentos nuevos se concentran en el extremo superior del rango y llegan a un solo fragmento. Hasta que el balanceador migra los bloques, ese fragmento absorbe todo el tráfico de escritura mientras los demás permanecen inactivos.
// 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 IOPSFragmentación hash: cómo funciona
En la fragmentación hash, MongoDB calcula un hash del valor de la clave de fragmentación y usa el hash para determinar el bloque. Los documentos se distribuyen según valores hash, que parecen aleatorios aunque las claves originales aumenten monótonamente. Esto garantiza una distribución inicial de las escrituras casi uniforme entre todos los fragmentos.
// Hashed sharding on _id (neutralizes ObjectId monotonicity)
sh.shardCollection('mydb.events', { _id: 'hashed' })
// Hashed sharding on userId
sh.shardCollection('mydb.sessions', { userId: 'hashed' })Fragmentación hash: ventajas
La fragmentación hash es la mejor opción cuando su objetivo principal es una distribución uniforme de las escrituras entre los fragmentos y no necesita realizar consultas por rangos sobre la clave de fragmentación. Es ideal para cargas de trabajo con una alta tasa de inserciones y claves monótonas (registros de eventos, datos de sensores IoT, mensajería), en las que cada fragmento debe absorber una parte igual del tráfico de escritura.
// 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 orderFragmentación hash: desventaja — sin eficiencia en rangos
La contrapartida de la fragmentación hash es que las consultas por rangos sobre la clave de fragmentación se convierten en operaciones de dispersión y recopilación. Como los valores hash adyacentes se distribuyen entre distintos fragmentos, una consulta como { createdAt: { $gte: t1, $lte: t2 } } debe dirigirse a todos los fragmentos. Si las consultas por rangos son frecuentes y sensibles a la latencia, la fragmentación hash puede anular las mejoras de rendimiento obtenidas con la fragmentación.
// 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 shardsElegir entre fragmentación por rangos y hash
Guía de decisión: fragmentación por rangos → su clave de fragmentación tiene una distribución natural (no es monótona) Y sus consultas principales son consultas por rangos sobre esa clave. Fragmentación hash → su clave de fragmentación es monótona O sus consultas principales son búsquedas puntuales (por igualdad) sobre un campo de alta cardinalidad. Si tiene dudas y el cuello de botella son las inserciones, prefiera la fragmentación hash.
Híbrida: clave compuesta con un componente hash
Puede combinar ambas estrategias con una clave de fragmentación compuesta cuyo primer campo se distribuya por rangos y proporcione afinidad para las consultas, mientras que un segundo campo hash reparte la carga dentro de cada rango. Ejemplo: { tenantId: 1, _id: 'hashed' } ubica los datos conjuntamente por tenant para las consultas dirigidas y, al mismo tiempo, distribuye las escrituras entre los fragmentos de cada 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('...') })Comprobar qué estrategia está activa
Puede inspeccionar la configuración de fragmentación de una colección para determinar qué estrategia se está usando. Los metadatos del servidor de configuración almacenan la clave de fragmentación y si utiliza 'hashed'. Tanto el comando sh.status() como db.collection.stats() exponen esta información.
// 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()División previa de bloques para cargas masivas
Al cargar datos en bloque en una colección recién fragmentada, todos los bloques se encuentran inicialmente en un solo fragmento y el balanceador debe migrarlos, lo que puede ser lento. La división previa crea un conjunto inicial de bloques vacíos distribuidos entre todos los fragmentos antes de la carga. Esto garantiza que se minimice el trabajo del balanceador y que las escrituras se distribuyan desde la primera inserción.
// 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' })Comprobación rápida
Compruebe su comprensión de los conceptos de MongoDB y las bases de datos NoSQL de esta lección.
Resumen de la lección
En esta lección ha aprendido que el sharding por rangos coloca conjuntamente valores de clave similares para realizar consultas por rangos de forma eficiente, pero crea puntos calientes con claves monotónicas, que el sharding hash distribuye los datos uniformemente entre los shards, pero hace que las consultas por rangos requieran scatter-gather y que las claves compuestas pueden combinar ambas ventajas. A continuación, exploraremos el zone sharding para fijar los datos en regiones específicas.
Aprende JavaScript con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 30
- Lecciones
- 120
Preguntas frecuentes
¿La lección «Estrategias de sharding por rangos frente a hash» es gratis?
Sí — el texto completo de «Estrategias de sharding por rangos frente a hash» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de MongoDB Academy, actualiza a CoddyKit PRO. El curso de MongoDB Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Estrategias de sharding por rangos frente a hash»?
Configurará una colección con sharding por rangos para consultas de rango o con sharding por hash para una distribución uniforme de escrituras, y comparará sus ventajas y desventajas. Practicas MongoDB Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar MongoDB Academy?
No se requiere experiencia previa. MongoDB Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Estrategias de sharding por rangos frente a hash»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de MongoDB Academy?
Sí. Cada lección de MongoDB Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Conceptos de sharding: chunks, balancer y claves de shard
- Elección de una clave de shard: cardinalidad, frecuencia y monotonía
- Estrategias de sharding por rangos frente a hash
- Sharding por zonas: asignación de datos a regiones