Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

analyzeShardKey (comando de base de datos)

analyzeShardKey

Nuevo en la versión 7.0.

Calcula métricas para evaluar una clave de partición para una colección no particionada o particionada. Las métricas se basan en consultas de muestra. Puedes usar configureQueryAnalyzer para configurar el muestreo de query en una colección.

Este comando está disponible en implementaciones alojadas en los siguientes entornos:

  • MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube

Nota

This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.

  • MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.

analyzeShardKey tiene esta sintaxis:

db.collection.analyzeShardKey(
<shardKey>,
{
keyCharacteristics: <bool>,
readWriteDistribution: <bool>,
sampleRate: <double>,
sampleSize: <int>
}
)
Campo
Tipo
Necesidad
Descripción

shardKey

Documento

Requerido

Clave de partición a analizar. Esto puede ser una clave candidata de partición para una colección no particionada o particionada, o la clave actual de partición para una colección particionada.

No hay ningún valor por defecto.

keyCharacteristics

booleano

Opcional

Whether or not the metrics about the characteristics of the shard key are calculated. For details, see keyCharacteristics.

Se establece por defecto en true.

readWriteDistribution

booleano

Opcional

Whether or not the metrics about the read and write distribution are calculated. For details, see readWriteDistribution.

Se establece por defecto en true.

To return read and write distribution metrics for a collection using analyzeShardKey, you must configure the query analyzer to sample the queries run on the collection. Otherwise, analyzeShardKey returns the read and write distribution metrics as 0 values. To configure the query analyzer, see configureQueryAnalyzer (database command).

sampleRate

Double

Opcional

La proporción de documentos en la colección a muestrear al calcular las métricas sobre las características de la clave de partición. Si estableces sampleRate, no puedes establecer sampleSize.

Debe ser mayor que 0, hasta e incluyendo 1.

No hay ningún valor por defecto.

sampleSize

entero

Opcional

El número de documentos que se deben muestrear al calcular las métricas sobre las características de la clave de partición. Si estableces sampleSize, no puedes establecer sampleRate.

Si no se especifica y sampleRate no se especifica, el tamaño de la muestra se define por defecto en el tamaño de la muestra establecido por analyzeShardKeyCharacteristicsDefaultSampleSize.

analyzeShardKey el comando devuelve diferentes métricas dependiendo de los valores keyCharacteristic y readWriteDistribution que especifiques al ejecutar el método.

keyCharacteristic consiste en las métricas sobre la cardinalidad, lafrecuencia y la monotonía de la clave de partición. Estas métricas solo se devuelven cuando keyCharacteristics es verdadero.

The metrics are calculated when analyzeShardKey command is run based on documents sampled from the collection. The calculation requires the shard key to have a supporting index. If there is no supporting index, no metrics are returned.

Puedes configurar el muestreo con los campos sampleRate y sampleSize. Ambos son opcionales, pero solo se puede especificar uno. Cuando ni sampleRate ni sampleSize están especificados, MongoDB utiliza el valor del parámetro analyzeShardKeyCharacteristicsDefaultSampleSize, que tiene un valor por defecto de 10 millones.

Para calcular métricas basadas en todos los documentos de la colección, establece el sampleRate en 1.

readWriteDistribution contiene métricas sobre los patrones de enrutamiento de consultas y la popularidad de los rangos de claves de fragmentos. Estas métricas se basan en consultas de muestra.

To configure query sampling for a collection, use the configureQueryAnalyzer command. The read and write distribution metrics are only returned if readWriteDistribution is true. The metrics are calculated when analyzeShardKey command is run and the metrics use the sampled read and write queries. If there are no sampled queries, read and write distribution metrics aren't returned.

  • Si no hay consultas de lectura muestreadas, el comando devuelve writeDistribution pero omite readDistribution.

  • Si no hay queries de guardar muestreadas, el comando devuelve readDistribution pero omite writeDistribution.

To return read and write distribution metrics for a collection using analyzeShardKey, you must configure the query analyzer to sample the queries run on the collection. Otherwise, analyzeShardKey returns the read and write distribution metrics as 0 values. To configure the query analyzer, see configureQueryAnalyzer (database command).

keyCharacteristics Valor
readWriteDistribution Valor
Resultados devueltos

true

false

false

true

analyzeShardKey el comando devuelve readWriteDistribution métricas y omite keyCharacteristics métricas.

true

true

  • analyzeShardKey devuelve tanto las readWriteDistribution métricas como las keyCharacteristics métricas.

  • If the shard key doesn't have a supporting index, analyzeShardKey command returns readWriteDistribution metrics and omits keyCharacteristics metrics.

analyzeShardKey el comando no bloquea las operaciones de lectura o guardar en la colección.

La calidad de las métricas sobre la distribución de lectura y escritura se determina por cuán representativo es la carga de trabajo cuando ocurre el muestreo de consultas. Para algunas aplicaciones, devolver métricas representativas puede requerir mantener el muestreo de query activado durante varios días.

El índice de soporte requerido por el comando analyzeShardKey es diferente del índice de soporte requerido por el comando shardCollection.

Esta tabla muestra los índices de apoyo para la misma clave de partición para ambos comandos analyzeShardKey y shardCollection:

Comando
clave de partición
Índices de soporte

analyzeShardKey Comando

{ a.x: 1, b: "hashed" }

  • { a.x: 1, b: 1, ... }

  • { a.x: "hashed", b: 1, ... }

  • { a.x: 1, b: "hashed", ... }

  • { a.x: "hashed", b: "hashed", ...}

shardCollection

{ a.x: 1, b: "hashed" }

{ a.x: 1, b: "hashed", ... }

Esto permite analizar una clave de partición que puede que aún no tenga un índice compatible necesario para particionarla.

Both analyzeShardKey command and shardCollection have the following index requirements:

Para crear índices de soporte, utiliza el método db.collection.createIndex().

Para minimizar el rendimiento, ejecuta el comando analyzeShardKey con la preferencia de lectura secondary o secondaryPreferred. En un clúster particionado, mongos establece automáticamente la preferencia de lectura en secondaryPreferred si no se especifica.

  • You cannot run analyzeShardKey command on Atlas flex clusters.

  • No se puede ejecutar el comando analyzeShardKey en implementaciones autónomas.

  • No puede ejecutar el comando analyzeShardKey directamente en un set de réplicas de --shardsvr. Cuando se ejecuta en un clúster particionado, el comando analyzeShardKey debe ejecutarse en un mongos.

  • You cannot run analyzeShardKey command against time series collections.

  • No se puede ejecutar el comando analyzeShardKey en colecciones con Queryable Encryption.

db.collection.analyzeShardKey el método requiere uno de estos roles:

analyzeShardKey command returns information regarding keyCharacteristics and readWriteDistribution.

  • keyCharacteristics proporciona métricas sobre la cardinalidad, la frecuencia y la monotonicidad de la clave de partición.

  • readWriteDistribution proporciona métricas sobre los patrones de enrutamiento de query y el nivel de actividad de los rangos de claves de particiones.

Esta es la estructura del documento keyCharacteristics que se devuelve cuando se establece keyCharacteristics en true:

{
keyCharacteristics: {
numDocsTotal: <integer>,
numOrphanDocs: <integer>,
avgDocSizeBytes: <integer>,
numDocsSampled: <integer>,
isUnique: <bool>,
numDistinctValues: <integer>,
mostCommonValues: [
{ value: <shardkeyValue>, frequency: <integer> },
...
],
monotonicity: {
recordIdCorrelationCoefficient: <double>,
type: "monotonic"|"not monotonic"|"unknown",
}
}
}
Campo
Tipo
Descripción
Uso

numDocsTotal

entero

El número de documentos en la colección.

numOrphanDocs

entero

El número de documentos huérfanos.

Los documentos huérfanos no se excluyen del cálculo de métricas por motivos de rendimiento. Si numOrphanDocs es grande en comparación con numDocsTotal, considera esperar hasta que el número de documentos huérfanos sea muy pequeño en comparación con el número total de documentos en la colección para ejecutar el comando.

avgDocSizeBytes

entero

El tamaño promedio de los documentos en la colección, en bytes.

Si numDocsTotal es comparable a numDocsSampled, puedes calcular el tamaño de los fragmentos más grandes multiplicando el frequency de cada mostCommonValues por avgDocSizeBytes.

numDocsSampled

entero

El número de documentos muestreados.

numDistinctValues

entero

El número de valores distintos de clave shard.

Elige una clave de partición con un gran numDistinctValues, ya que el número de valores distintos de la clave de partición es el número máximo de fragmentos que el balanceador puede crear.

isUnique

booleano

Indica si la clave de partición es única. Esto solo se configura en true si existe un índice único para la clave de partición.

Si la clave de partición es única, entonces el número de valores distintos es igual al número de documentos.

mostCommonValues

arreglo de documentos

Un arreglo de valor y frequency (número de documentos) de los valores de la clave de partición más comunes.

La frecuencia de un valor de la clave de partición es el número mínimo de documentos en el fragmento que contiene ese valor. Si la frecuencia es grande, entonces el fragmento puede convertirse en un cuello de botella para el almacenamiento, las lecturas y las escrituras. Elija una clave de partición donde la frecuencia de cada valor más común sea baja en relación con numDocsSampled.

El número de los valores de la clave de partición más comunes se puede configurar mediante ajuste de analyzeShardKeyNumMostCommonValues, que tiene como valor predeterminado 5. Para evitar superar el límite de tamaño BSON de 16 MB para la respuesta, cada valor se establece en "truncado" si su tamaño supera los 15 MB / <a class=\" \" href=\"\">analizarShardKey NumMostCommonValues.

mostCommonValues[n].value

Documento

La clave de partición.

mostCommonValues[n].frequency

entero

El número de documentos para una clave de partición determinada.

Elija una clave de partición donde la frecuencia de cada valor más común sea baja en relación con numDocsSampled.

monotonicity. recordIdCorrelationCoefficient

Double

Solo se establece si se conoce la monotonía.

Esto se configura en "unknown" cuando se cumple una de las siguientes condiciones:

  • La clave de partición no tiene un índice que la respalde por shardCollection definición.

  • La colección está agrupada.

  • La clave de partición es una clave de partición compuesta encriptada, donde el campo que se encripta no es el primer campo.

La verificación de monotonía puede devolver un resultado incorrecto si la colección ha pasado por migraciones de fragmentos. La migración de fragmentos elimina los documentos de la partición donante y los vuelve a insertar en la partición receptora. No existe ninguna garantía de que se preserve el orden de inserción del cliente.

Puedes configurar el umbral para el coeficiente de correlación con analyzeShardKeyMonotonicity CorrelationCoefficientThreshold.

monotoncity.type

string

Puede ser una de:

"monotonic", "not monotonic", "unknown"

Evita una clave de partición (shard key) del tipo "monotonic", a menos que no esperes insertar nuevos documentos con frecuencia.

Si una colección está particionada en una clave de partición que aumenta o disminuye de manera monótona, los nuevos documentos se insertarán en la partición que posea el fragmento MaxKey o MinKey. Esa partición puede convertirse en el cuello de botella para las inserciones y es probable que los datos no estén equilibrados la mayor parte del tiempo, ya que el balanceador tendrá que competir con las inserciones que lleguen.

Esta es la estructura del documento que se devuelve cuando readWriteDistribution está configurado en true:

{
readDistribution: {
sampleSize: {
total: <integer>,
find: <integer>,
aggregate: <integer>,
count: <integer>,
distinct: <integer>
},
percentageOfSingleShardReads: <double>,
percentageOfMultiShardReads: <double>,
percentageOfScatterGatherReads: <double>,
numReadsByRange: [
<integer>,
...
]
},
writeDistribution: {
sampleSize: {
total: <integer>,
update: <integer>,
delete: <integer>,
findAndModify: <integer>
},
percentageOfSingleShardWrites: <double>,
percentageOfMultiShardWrites: <double>,
percentageOfScatterGatherWrites: <double>,
numWritesByRange: [
<integer>,
...
],
percentageOfShardKeyUpdates: <double>,
percentageOfSingleWritesWithoutShardKey: <double>,
percentageOfMultiWritesWithoutShardKey: <double>
}
}

To return read and write distribution metrics for a collection using analyzeShardKey, you must configure the query analyzer to sample the queries run on the collection. Otherwise, analyzeShardKey returns the read and write distribution metrics as 0 values. To configure the query analyzer, see configureQueryAnalyzer (database command).

Campo
Tipo
Descripción
Uso

sampleSize.total

entero

La cantidad total de queries de lectura muestreados.

sampleSize.find

entero

Cantidad total de consultas de find muestreadas.

sampleSize.aggregate

entero

Cantidad total de consultas de aggregate muestreadas.

sampleSize.count

entero

Cantidad total de consultas de count muestreadas.

sampleSize.distinct

entero

Cantidad total de consultas de distinct muestreadas.

percentageOfSingleShardReads

Double

Porcentaje de lecturas que se dirigen a una sola partición, independientemente de cómo se distribuyen los datos.

percentageOfMultiShardReads

Double

Porcentaje de lecturas que se dirigen a varias particiones.

Esta categoría incluye las lecturas que solo pueden dirigirse a una sola partición si los datos se distribuyen de tal manera que los valores dirigidos por la lectura caen en una sola partición.

Si las consultas operan sobre una gran cantidad de datos, entonces dirigirlas a varias particiones en vez de solo a uno puede reducir la latencia debido a la ejecución paralela de consultas.

percentageOfScatterGatherReads

Double

Porcentaje de lecturas que son scatter-gather, independientemente de cómo se distribuyan los datos.

Evita una clave de partición con un valor elevado para esta métrica. Si bien las consultas de dispersión-recolección tienen un bajo impacto en las particiones que no contienen los datos de destino, todavía tienen algún impacto en el rendimiento.

En un clúster con una gran cantidad de particiones, las queries scatter-gather tienen un rendimiento significativamente peor que las queries que se dirigen a una única partición.

numReadsByRange

arreglo de enteros

Arreglo de números que representan el número de veces que se ataca cada rango ordenado de MinKey a MaxKey.

Evita una clave de partición donde la distribución de numReadsByRange sea muy sesgada, ya que eso implica que probablemente haya uno o más particiones activas para la lectura.

Elige una clave de partición donde la suma de numReadsByRange sea similar a sampleSize.total.

El número de rangos se puede configurar usando el parámetro analyzeShardKeyNumRanges, cuyo valor por defecto es 100. El valor es 100 porque el objetivo es encontrar una clave de partición que se escale hasta 100 particiones.

Campo
Tipo
Descripción
Uso

sampleSize.total

entero

La cantidad total de queries de escritura muestreados.

sampleSize.update

entero

Cantidad total de consultas de update muestreadas.

sampleSize.delete

entero

Cantidad total de consultas de delete muestreadas.

sampleSize.findAndModify

entero

Cantidad total de consultas de findAndModify muestreadas.

percentageOfSingleShardWrites

Double

Porcentaje de escrituras que se dirigen a una sola partición, independientemente de cómo se distribuyan los datos.

percentageOfMultiShardWrites

Double

Porcentaje de escrituras que tienen como objetivo varias particiones.

Esta categoría incluye las escrituras que pueden dirigirse solo a una sola partición si los datos están distribuidos de tal manera que los valores a los que se dirige la escritura caen en una sola partición.

percentageOfScatterGatherWrites

Double

Porcentaje de escrituras que son scatter-gather, independientemente de cómo se distribuya la información.

Evita una clave de partición con un valor alto para esta métrica, ya que generalmente es más eficiente que un guardado se dirija a una única partición.

numWritesByRange

arreglo de enteros

Arreglo de números que representan el número de veces que se ataca cada rango ordenado de MinKey a MaxKey.

Evita una clave de partición donde la distribución de numWritesByRange esté muy sesgada, ya que eso implica que probablemente haya uno o más particiones activas para escrituras.

Elige una clave de partición donde la suma de numWritesByRange sea similar a sampleSize.total.

El número de rangos se puede configurar usando el parámetro analyzeShardKeyNumRanges, cuyo valor por defecto es 100. El valor es 100 porque el objetivo es encontrar una clave de partición que se escale hasta 100 particiones.

percentageOfShardKeyUpdates

Double

Porcentaje de consultas de escritura que actualizan el valor de la clave de partición de un documento.

Evitar una clave de partición con un percentageOfShardKeyUpdates alto. Las actualizaciones del valor de la clave de partición de un documento pueden provocar que este se mueva a una partición diferente, lo que requiere ejecutar una transacción interna en la partición al que se dirige la query. Para detalles sobre cómo cambiar el valor de la clave de partición de un documento, consulta Cambiar una clave de partición.

Actualmente, las actualizaciones solo se admiten como escrituras reintentables o en una transacción, y tienen un límite de tamaño de lote de 1.

percentageOfSingleWritesWithoutShardKey

Double

El porcentaje de consultas de escritura que están multi=false y no pueden dirigirse a una única partición.

Evita una clave de partición con un valor alto para esta métrica.

Realizar este tipo de guardado es costoso porque puede implicar la ejecución de transacciones internas.

percentageOfMultiWritesWithoutShardKey

Double

El porcentaje de consultas de escritura que están multi=true y no pueden dirigirse a una única partición.

Evita una clave de partición con un valor alto para esta métrica.

Considera una versión simplificada de una aplicación de redes sociales. La colección que intentamos hacer una partición es la colección post.

Los documentos en la colección post tienen el siguiente esquema:

{
userId: <uuid>,
firstName: <string>,
lastName: <string>,
body: <string>, // the field that can be modified.
date: <date>, // the field that can be modified.
}
  • La aplicación tiene 1500 usuarios.

  • Hay 30 apellidos y 45 nombres, algunos más comunes que otros.

  • Hay tres usuarios famosos.

  • Cada usuario sigue exactamente a cinco usuarios más y tiene una probabilidad muy alta de seguir al menos a un usuario famoso.

  • Cada usuario publica alrededor de dos publicaciones al día en horarios aleatorios. Editan cada publicación una vez, justo después de que se haya publicado.

  • Cada usuario inicia sesión cada seis horas para leer su propio perfil y las publicaciones de los usuarios que sigue de las últimas 24 horas. También responden bajo una publicación aleatoria de las últimas tres horas.

  • Para cada usuario, la aplicación remueve las publicaciones que tienen más de tres días a la medianoche.

Esta carga de trabajo tiene los siguientes patrones de query:

  • find comando con filtro { userId: , firstName: , lastName: }

  • find comando con filtro { $or: [ { userId: , firstName: , lastName: , date: { $gte: } }, ... , { userId: , date: } ] }

  • findAndModify comando con filtro { userId: , firstName: , lastName: , date: } para actualizar el cuerpo y la fecha del campo.

  • update comando con multi: false y filtro { userId: , firstName: , lastName: , date: { $gte: , $lt: } } para actualizar el cuerpo y el campo de fecha.

  • delete comando con multi: true y filtro { userId: , firstName: , lastName: , date: { $lt: } }

A continuación se muestran métricas de ejemplo devueltas por el comando analyzeShardKey para algunas claves de fragmentos candidatas, con consultas de muestra recopiladas durante siete días de carga de trabajo.

Nota

Before you run analyzeShardKey commands, read the Supporting Indexes section earlier on this page. If you require supporting indexes for the shard key you are analyzing, use the db.collection.createIndex() method to create the indexes.

Este ejemplo utiliza el comando analyzeShardKey para proporcionar métricas sobre la clave de partición { _id: 1 } en la colección social.post.

El siguiente bloque de código utiliza db.collection.configureQueryAnalyzer() para activar el muestreo de consultas:

use social
db.post.configureQueryAnalyzer(
{
mode: "full",
samplesPerSecond: 5
}
)

Después de que db.collection.configureQueryAnalyzer() recopile muestras de query, el siguiente bloque de código utiliza el comando analyzeShardKey para tomar una muestra de 10 y000 documentos y calcular los resultados:

use social
db.post.analyzeShardKey(
{ _id: 1 },
{
keyCharacteristics: true,
readWriteDistribution: false,
sampleSize: 10000
}
)

Este comando analyzeShardKey proporciona métricas sobre la clave de partición { lastName: 1 } de la colección social.post:

use social
db.post.analyzeShardKey(
{ lastName: 1 },
{
keyCharacteristics: true,
readWriteDistribution: false
}
)

La salida para este ejemplo se asemeja a lo siguiente:

{
"keyCharacteristics": {
"numDocsTotal" : 9039,
"avgDocSizeBytes" : 153,
"numDocsSampled" : 9039,
"isUnique" : false,
"numDistinctValues" : 30,
"mostCommonValues" : [
{
"value" : {
"lastName" : "Smith"
},
"frequency" : 1013
},
{
"value" : {
"lastName" : "Johnson"
},
"frequency" : 984
},
{
"value" : {
"lastName" : "Jones"
},
"frequency" : 962
},
{
"value" : {
"lastName" : "Brown"
},
"frequency" : 925
},
{
"value" : {
"lastName" : "Davies"
},
"frequency" : 852
}
],
"monotonicity" : {
"recordIdCorrelationCoefficient" : 0.0771959161,
"type" : "not monotonic"
},
}
}

Este comando analyzeShardKey proporciona métricas sobre la clave de partición { userId: 1 } de la colección social.post:

use social
db.post.analyzeShardKey(
{ userId: 1 },
{
keyCharacteristics: true,
readWriteDistribution: false
}
)

La salida para este ejemplo se asemeja a lo siguiente:

{
"keyCharacteristics": {
"numDocsTotal" : 9039,
"avgDocSizeBytes" : 162,
"numDocsSampled" : 9039,
"isUnique" : false,
"numDistinctValues" : 1495,
"mostCommonValues" : [
{
"value" : {
"userId" : UUID("aadc3943-9402-4072-aae6-ad551359c596")
},
"frequency" : 15
},
{
"value" : {
"userId" : UUID("681abd2b-7a27-490c-b712-e544346f8d07")
},
"frequency" : 14
},
{
"value" : {
"userId" : UUID("714cb722-aa27-420a-8d63-0d5db962390d")
},
"frequency" : 14
},
{
"value" : {
"userId" : UUID("019a4118-b0d3-41d5-9c0a-764338b7e9d1")
},
"frequency" : 14
},
{
"value" : {
"userId" : UUID("b9c9fbea-3c12-41aa-bc69-eb316047a790")
},
"frequency" : 14
}
],
"monotonicity" : {
"recordIdCorrelationCoefficient" : -0.0032039729,
"type" : "not monotonic"
},
}
}

Este comando analyzeShardKey proporciona métricas sobre la clave de partición { userId: 1 } de la colección social.post:

use social
db.post.analyzeShardKey(
{ userId: 1 },
{
keyCharacteristics: false,
readWriteDistribution: true
}
)

La salida para este ejemplo se asemeja a lo siguiente:

{
"readDistribution" : {
"sampleSize" : {
"total" : 61363,
"find" : 61363,
"aggregate" : 0,
"count" : 0,
"distinct" : 0
},
"percentageOfSingleShardReads" : 50.0008148233,
"percentageOfMultiShardReads" : 49.9991851768,
"percentageOfScatterGatherReads" : 0,
"numReadsByRange" : [
688,
775,
737,
776,
652,
671,
1332,
1407,
535,
428,
985,
573,
1496,
...
],
},
"writeDistribution" : {
"sampleSize" : {
"total" : 49638,
"update" : 30680,
"delete" : 7500,
"findAndModify" : 11458
},
"percentageOfSingleShardWrites" : 100,
"percentageOfMultiShardWrites" : 0,
"percentageOfScatterGatherWrites" : 0,
"numWritesByRange" : [
389,
601,
430,
454,
462,
421,
668,
833,
493,
300,
683,
460,
...
],
"percentageOfShardKeyUpdates" : 0,
"percentageOfSingleWritesWithoutShardKey" : 0,
"percentageOfMultiWritesWithoutShardKey" : 0
}
}