Elección de una clave de shard: cardinalidad, frecuencia y monotonía
Evaluará las candidatas a clave de shard según tres dimensiones —cardinalidad, distribución de escrituras y direccionamiento de consultas— y evitará patrones antirrecomendados de shards saturados.
Elección de una clave de shard: cardinalidad, frecuencia y monotonía es una lección gratuita de MongoDB Academy en CoddyKit. Esta es la lección 2 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.
Por qué es fundamental elegir bien la clave de fragmentación
La clave de fragmentación es inmutable una vez establecida y no se puede cambiar sin desfragmentar y volver a fragmentar toda la colección, una operación costosa y disruptiva. Elegir una clave de fragmentación incorrecta provoca fragmentos calientes, un enrutamiento deficiente de las consultas y un desaprovechamiento del hardware. Debe evaluar las candidatas en tres dimensiones: cardinalidad, frecuencia y monotonicidad.
Cardinalidad: ¿cuántos valores distintos hay?
La cardinalidad es el número de valores distintos que puede adoptar la clave de fragmentación. Una cardinalidad alta (por ejemplo, userId, email, orderId) es beneficiosa: proporciona a MongoDB muchos límites de bloque posibles y permite que el balanceador distribuya los datos con precisión. Una cardinalidad baja (por ejemplo, status: 'active' | 'inactive' o country con 50 valores) crea bloques jumbo que no se pueden dividir ni migrar.
// 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 }) // BADFrecuencia: ¿cómo de uniformemente se distribuyen los valores?
La frecuencia mide cuántos documentos comparten cada valor de la clave de fragmentación. Incluso las claves de alta cardinalidad pueden ser problemáticas si un pequeño número de valores aparece en la gran mayoría de los documentos. Por ejemplo, un campo countryCode podría tener 200 valores distintos, pero el 90 % de los usuarios podría proceder de un solo país, lo que crearía un bloque caliente enorme que no se puede dividir.
// 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 keyMonotonicidad: ¿los valores siempre aumentan?
La monotonicidad indica si los valores de la clave de fragmentación aumentan (o disminuyen) siempre con el tiempo. Los campos como las marcas de tiempo createdAt y ObjectId (_id) son monótonamente crecientes. Esto resulta problemático porque todas las inserciones nuevas llegan al mismo bloque «máximo» de un fragmento, lo que crea un punto caliente de escritura incluso cuando los datos han estado distribuidos uniformemente históricamente.
// 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' })Resumen de las propiedades de una clave de fragmentación ideal
La clave de fragmentación ideal tiene: alta cardinalidad: miles o millones de valores distintos. Poca asimetría de frecuencia: ningún valor domina. Distribución no monótona: los valores no aumentan siempre, o se usa fragmentación hash. Alineación con las consultas: coincide con los filtros de las consultas más frecuentes y sensibles a la latencia para permitir un enrutamiento dirigido.
Claves de fragmentación compuestas
Una clave de fragmentación compuesta combina dos campos para mejorar la distribución. Por ejemplo, { tenantId: 1, createdAt: 1 } distribuye los datos entre los tenants (alta cardinalidad) y permite consultas por rangos dentro de cada tenant. El primer campo determina la distribución general; el segundo proporciona una división más precisa. Las claves compuestas pueden satisfacer predicados de consulta con varios campos como consultas dirigidas.
// 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') } })Claves de fragmentación hash
Una clave de fragmentación hash aplica una función hash al valor del campo antes de asignarlo a un bloque. Esto convierte las claves monótonas (como ObjectId) en valores hash distribuidos aleatoriamente, eliminando los puntos calientes de escritura. La contrapartida es que las consultas por rangos sobre el campo se convierten en operaciones de dispersión y recopilación, ya que los valores hash no se almacenan en el orden original.
// 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)Fragmentación por zonas para la distribución geográfica
MongoDB permite la fragmentación por zonas, en la que se asignan rangos de claves de fragmentación a fragmentos específicos mediante etiquetas (zonas). Esto resulta útil para cumplir requisitos de residencia de datos: los datos de usuarios europeos pueden fijarse en fragmentos de la región de la UE y los datos de EE. UU., en fragmentos de EE. UU. La fragmentación por zonas requiere una clave de fragmentación compuesta cuyo primer componente sea un prefijo de región.
// 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'
)Evaluación de candidatas: lista de comprobación práctica
Al evaluar candidatas para la clave de fragmentación: 1) ejecute una comprobación de cardinalidad; db.col.distinct('field').length debería dar como resultado miles o más. 2) Compruebe la distribución de frecuencias mediante una agregación. 3) Determine si el campo es monótono (marcas de tiempo, incremento automático). 4) Revise sus 5 consultas más frecuentes: ¿aparece el campo candidato en su filtro?
// 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 } } }
])El campo _id como clave de fragmentación hash
Un valor predeterminado habitual y seguro para muchas cargas de trabajo es usar { _id: 'hashed' }. Los valores ObjectId de MongoDB, aunque son monótonos, se distribuyen uniformemente después de aplicarles un hash. Esto proporciona una distribución uniforme de las escrituras desde el principio. La principal limitación es que cualquier consulta por rangos sobre _id se convierte en una operación de dispersión y recopilación, pero para la mayoría de las cargas de trabajo de búsqueda a nivel de documento esto resulta aceptable.
// 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('...') })Selección de la clave de fragmentación en Atlas
MongoDB Atlas proporciona un Shard Key Advisor en Performance Advisor que analiza sus patrones de consulta y recomienda claves de fragmentación basándose en el uso real. Puede detectar claves monótonas, asimetrías de frecuencia e índices ausentes. Usar el asesor antes de fragmentar resulta especialmente útil para cargas de trabajo de producción cuyos patrones de consulta ya están establecidos.
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: una buena clave de fragmentación tiene una cardinalidad alta, poca asimetría de frecuencia y evita los valores monótonos, las claves de fragmentación compuestas combinan cobertura para la distribución y el direccionamiento de consultas y la fragmentación hash neutraliza los puntos calientes de las claves monótonas a costa de la eficiencia de las consultas por rangos. A continuación, compararemos en detalle las estrategias de fragmentación por rangos y hash.
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 «Elección de una clave de shard: cardinalidad, frecuencia y monotonía» es gratis?
Sí — el texto completo de «Elección de una clave de shard: cardinalidad, frecuencia y monotonía» 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 «Elección de una clave de shard: cardinalidad, frecuencia y monotonía»?
Evaluará las candidatas a clave de shard según tres dimensiones —cardinalidad, distribución de escrituras y direccionamiento de consultas— y evitará patrones antirrecomendados de shards saturados. 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 2 de 4.
¿Cuánto tiempo toma la lección «Elección de una clave de shard: cardinalidad, frecuencia y monotonía»?
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