Docs Menu
Docs Home
/ /

Elige una clave de partición

La elección de la clave de fragmento afecta la creación y Distribución de fragmentos entre los fragmentos disponibles. La distribución de datos afecta la eficiencia y el rendimiento de las operaciones dentro del clúster fragmentado.

La clave de partición ideal permite a MongoDB distribuir los documentos uniformemente por todo el clúster, a la vez que facilita patrones de queries comunes.

Cuando se elija la clave de partición, se debe considerar:

  • el cardinalidad de la clave del fragmento

  • la frecuencia con la que se producen los valores de la clave de partición

  • si una posible clave de partición crece de forma monótona

  • Patrones de queries de particionado

  • Limitaciones de la clave de fragmentación

Nota

Importante

Si se cambia regularmente el valor de la clave de partición de un documento para que el valor esté en un rango de clave de partición propiedad de otra partición, se puede tener un impacto en el rendimiento del clúster debido a los recursos adicionales que implica migrar el documento entre particiones. Para más detalles, se puede consultar Particionamiento de datos con fragmentos y db.colección.updateOne().

La cardinalidad de una clave de partición determina la cantidad máxima de fragmentos que el balanceador puede crear. Siempre que sea posible, se debe elegir una clave de partición con alta cardinalidad. Una clave de partición con baja cardinalidad reduce la eficacia del escalado horizontal en el clúster.

Cada valor de la clave de partición único puede existir en no más de un fragmento en cualquier momento dado. Se debe considerar un conjunto de datos que contenga datos de usuario con un campo continent. Si se elige particionar en continent, la clave de partición tendría una cardinalidad de 7. Una cardinalidad de 7 significa que no puede haber más de 7 fragmentos dentro del clúster, cada uno de los cuales almacena un valor de la clave de partición único. Esto limita el número de particiones efectivas en el clúster a 7 también; añadir más de siete fragmentos no aportaría ningún beneficio.

La siguiente imagen ilustra un clúster usando particionado usando el campo X como clave de partición. Si X tiene una cardinalidad baja, la distribución de las inserciones puede ser similar a la siguiente:

Diagrama de una mala distribución de clave de partición debido a la baja cardinalidad
haga clic para ampliar

Si un modelo de datos requiere el particionado en una clave que tenga baja cardinalidad, se debe considerar usar un compuesto indexado de campos para aumentar la cardinalidad.

Una clave de partición con alta cardinalidad no garantiza por sí sola una distribución uniforme de los datos en el clúster. La frecuencia de la clave de partición y la posibilidad de que los valores de la clave de partición cambien monotónicamente también contribuyen a la distribución de los datos.

La frequency del valor de la clave de partición indica con qué frecuencia aparece un valor de la clave de partición en los datos. Si la mayoría de los documentos contienen solo un subconjunto de los posibles valores de la clave de partición, entonces los fragmentos que almacenan esos documentos pueden convertirse en un cuello de botella dentro del clúster. Además, a medida que esos fragmentos crecen, pueden convertirse en fragmentos indivisibles ya que no se pueden dividir más. Esto reduce la efectividad del escalado horizontal dentro del clúster.

La siguiente imagen ilustra un clúster usando particionado usando el campo X como clave de partición. Si un subconjunto de valores para X ocurre con alta frecuencia, la distribución de las inserciones puede ser similar a la siguiente:

Diagrama de una mala distribución de clave de partición por alta frecuencia
haga clic para ampliar

Si un modelo de datos requiere particionado en una clave que tiene valores de alta frecuencia, se debe considerar usar un índice compuesto utilizando un valor único o de baja frecuencia.

Una clave de partición con baja frecuencia no garantiza por sí sola una distribución uniforme de los datos a través del clúster. La cardinalidad de la clave de partición y la posibilidad de que los valores de la clave de partición cambien monotónicamente también contribuyen a la distribución de los datos.

Una clave de partición basada en un valor que aumenta o disminuye de manera monótona tiene más probabilidades de distribuir las inserciones en un único fragmento dentro del clúster.

Esto ocurre porque cada clúster tiene un fragmento que captura un rango con un límite superior de MaxKey. maxKey siempre se compara como mayor que todos los demás valores. De manera similar, hay un fragmento que captura un rango con un límite inferior de MinKey. minKey siempre te comparas por debajo de todos los demás valores.

Si el valor de la clave de partición está siempre aumentando, todos los nuevos insertos se enrutan al fragmento con maxKey como cota superior. Si el valor de la clave de partición siempre disminuye, todos los nuevos insertos se enrutan al fragmento con minKey como cota inferior. La partición que contiene ese fragmento se convierte en el cuello de botella para las operaciones de guardar.

Para optimizar la distribución de datos, los fragmentos que contienen el maxKey (o minKey) global no permanecen en la misma partición. Cuando se produce una división de un fragmento, el nuevo fragmento con el maxKey (o minKey) se encuentra en otra partición.

La siguiente imagen ilustra un clúster usando particionado usando el campo X como clave de partición. Si los valores de X aumentan monótonamente, la distribución de las inserciones puede ser similar a la siguiente:

Diagrama de una distribución deficiente de clave de partición debido a que la clave de partición aumenta o disminuye de forma monótona
haga clic para ampliar

Si el valor de la clave de partición disminuyera monótonamente, todas las inserciones se dirigirían a Chunk A .

Si tu modelo de datos requiere particionar una clave que cambia de forma monótona, considera usar el particionado encriptado.

Una clave de partición que no cambia de forma monótona no garantiza por sí sola una distribución uniforme de los datos a través del clúster. La cardinalidad y la frecuencia de la clave de partición también contribuyen a la distribución de los datos.

La clave de partición ideal distribuye los datos de manera uniforme en el clúster, al tiempo que facilita los patrones de queries comunes. Cuando se elija una clave de partición, se deben considerar los patrones de queries más comunes y si una determinada clave de partición los cubre.

En un clúster particionado, la mongos dirige las queries solo a las particiones que contienen los datos relevantes si las queries contienen la clave de partición. Cuando las consultas no contienen la clave de partición, las consultas se transmiten a todas las particiones para su evaluación. Este tipo de consultas se denominan consultas de recopilación dispersa. Las consultas que implican varias particiones para cada solicitud son menos eficaces y no escalan linealmente a medida que se añaden más particiones al clúster.

Esto no se aplica a las queries de agregación que operan en una gran cantidad de datos. En estos casos, la dispersión-recopilación puede ser un enfoque útil que permite que la query se ejecute en paralelo en todas las particiones.

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.

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:

Para supervisar el proceso de muestreo de query, utiliza la etapa $currentOp. Para un ejemplo, consulte queries de muestra.

Para analizar una clave de fragmentación, consulte:

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 keyCharacteristics contiene métricas sobre la cardinalidad, la frecuencia y la monotonicidad de la clave de partición.

  • El campo readWriteDistribution contiene 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.

Tip

Volver

Fragmenta una colección

Obtén una insignia de habilidad

¡Domina gratis la “Optimización del diseño de esquemas”!

Más información

En esta página