La clave de fragmento es una clave indexada única campo o campos múltiples cubiertos por un índice compuesto que determina la distribución de los documentos de la colección entre los fragmentos del clúster.
MongoDB divide el rango de valores de clave de partición (o valores de clave de partición encriptados) en rangos no superpuestos de valores de clave de partición (o valores de clave de partición encriptados). Cada rango está asociado con un fragmento, y MongoDB intenta distribuir los fragmentos uniformemente entre los fragmentos del clúster.
La clave de partición tiene una relación directa con la efectividad de la distribución de fragmentos. Consultar Elegir una clave de partición.
Índices de clave de partición
Las colecciones particionadas suelen requerir un índice que admita la clave de partición. El índice puede ser un índice en la clave de partición o un índice compuesto donde la clave de partición es un prefijo del índice.
Si la colección está vacía,
sh.shardCollection()crea el índice en la clave del fragmento si dicho índice aún no existe.Si la colección no está vacía, primero se debe crear el índice antes de usar
sh.shardCollection().
No se puede descartar ni ocultar un índice si es el único índice no oculto que admite la clave de fragmentación.
A partir de MongoDB 7.0.3, 6.0.12, y 5.0.22, puede descartar el índice de una clave de fragmentación encriptada. Para obtener más información, consulte Descartar un índice de clave de fragmentación encriptada.
Unique Indexes
MongoDB puede aplicar una restricción de unicidad en un índice de clave de partición clasificado por rango. El uso de un índice único en la clave de partición aplica la unicidad en toda la combinación de la clave y no en los componentes individuales de la clave de partición.
Para una colección particionada clasificada por rango, solo los siguientes índices pueden ser únicos:
El índice en la clave de fragmentación
Un índice compuesto donde la clave de partición es un prefijo
El índice
_idpor defecto; sin embargo, el índice_idsolo aplica la restricción de unicidad por fragmento si el campo_idno es la clave de fragmentación.
Importante
Los clústeres particionados no aplican la restricción de unicidad en los campos _id en todo el clúster cuando el campo _id no es la clave de partición.
Si el campo _id no es la clave de partición, la restricción de unicidad solo se aplica a la partición que almacena el documento. Esto significa que dos o más documentos pueden tener el mismo valor _id, siempre que se encuentren en particiones diferentes.
Por ejemplo, una colección particionada con la clave de partición {x:
1} que se extiende por dos particiones A y B. Dado que la clave _id no es la clave de partición, la colección podría tener un documento con el valor _id 1 en la partición A y otro documento con el valor _id 1 en el partición B.
En los casos en que el campo _id no sea la clave de partición, MongoDB espera que las aplicaciones garanticen la unicidad de los valores de _id entre las particiones, por ejemplo, utilizando un identificador único para completar el campo _id.
Las restricciones de índices únicos implican que:
Para una colección particionada, no puede fragmentarse la colección si tiene varios índices únicos, a menos que la clave de partición sea el prefijo de todos los índices únicos.
Para una colección ya particionada, no puedes crear índices únicos en otros campos a menos que la clave de partición se incluya como prefijo.
Un índice único almacena un valor nulo para un documento al que le falta el campo indexado; es decir, un campo de índice que falta se trata como otra instancia de un valor de clave de índice
null. Para más información, consultar Campo de documento faltante en un índice único de un solo campo.
Para aplicar la unicidad en los valores de la clave de fragmentación, pasar el parámetro unique como true al método sh.shardCollection():
Si la colección está vacía,
sh.shardCollection()crea un índice único en la clave de fragmentación si tal índice no existe ya.Si la colección no está vacía, primero se debe crear el índice antes de usar
sh.shardCollection().
Aunque se puede tener un índice compuesto único donde la clave de fragmentación es un prefijo, si se utiliza el parámetro unique, la colección debe tener un índice único que esté en la clave de partición.
No puedes especificar una restricción única en un índice encriptado.
Para mantener la singularidad en un campo que no es la clave de partición, se debe consultar Restricciones de singularidad en campos arbitrarios.
Campos de clave de fragmentación faltantes
Los documentos en colecciones particionadas pueden no tener los campos de clave de partición. Para establecer los campos de clave de partición que faltan, consultar Establecer campos de clave de partición que faltan.
Rango de partición y campos de clave de partición faltantes
Los campos de clave de partición que faltan caen dentro del mismo rango de partición que las claves de partición con valores nulos. Por ejemplo, si la clave de partición está en los campos { x:
1, y: 1 }, entonces:
Documento sin clave de partición | Cae en el mismo rango que |
|---|---|
|
|
|
|
|
|
Operaciones de lectura/guardado y campos de clave de partición faltantes
Para dirigirse a documentos con campos de clave de partición faltantes, se puede utilizar la condición de filtro { $exists: false } en los campos de clave de partición. Por ejemplo, si la clave de partición está en los campos { x: 1, y: 1
}, se pueden encontrar los documentos con campos de clave de partición faltantes ejecutando esta query:
db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
Si especifica una condición de filtro de coincidencia de igualdad nula (por { x: null
} ejemplo,), el filtro coincide tanto aquellos documentos con campos de clave de fragmento faltantes como aquellos con campos de clave de fragmento configurados null en.
Algunas operaciones de escritura, como una escritura con una especificación de upsert, requieren una coincidencia exacta en la clave de fragmentación. En esos casos, para dirigirse a un documento que carece de la clave de fragmentación, incluya otra condición de filtro además de la coincidencia exacta null. Por ejemplo:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key
Utilizar el Analizador de Clave de partición para encontrar la clave de partición
A partir de la versión 7.0, MongoDB facilita la elección de la clave de partición. Se puede usar analyzeShardKey que calcula las métricas para evaluar una clave de fragmentación para una colección no particionada o particionada. Las métricas se basan en queries muestreadas, lo que permite tomar una decisión basada en datos para la clave de partición.
Habilitar el muestreo de query
Para analizar una clave de fragmentación, debes habilitar el muestreo de query en la colección de destino. Para obtener más información, consulta:
configureQueryAnalyzercomando de base de datosdb.collection.configureQueryAnalyzer()método del shell
Para supervisar el proceso de muestreo de query, utiliza la etapa $currentOp. Para un ejemplo, consulte queries de muestra.
Comandos de análisis de claves de partición
Para analizar una clave de fragmentación, consulte:
analyzeShardKeycomando de base de datosdb.collection.analyzeShardKey()método del shell
analyzeShardKey Devuelve métricas sobre las características clave de una clave de fragmentación y su distribución de lectura y guardado. Las métricas se basan en queries de muestra.
El campo
keyCharacteristicscontiene métricas sobre la cardinalidad, la frecuencia y la monotonicidad de la clave de fragmentación.El campo
readWriteDistributioncontiene métricas sobre los patrones de enrutamiento de las queries y la distribución de la carga de los rangos de clave de partición.