Docs Menu
Docs Home
/ /

Colecciones con índice clusterizado

Novedades en la versión 5.3.

Las colecciones agrupadas almacenan documentos indexados en el mismo ArchivoWiredTiger como especificación del índice. Almacenar los documentos y el índice de la colección en el mismo archivo ofrece ventajas de almacenamiento y rendimiento en comparación con los índices convencionales.

Las colecciones con índice clusterizado se crean con un índice clusterizado. El índice clusterizado especifica el orden en el que se almacenan los documentos.

Para crear una colección agrupada, consulte Ejemplos.

Importante

Característica incompatible con versiones anteriores

Debes descartar colecciones con índice clusterizado antes de poder degradar a una versión de MongoDB anterior a la 5.3.

Las colecciones con índice clusterizado tienen los siguientes beneficios en comparación con las colecciones no clusterizadas:

  • Query más rápida en colecciones con índice clusterizado sin necesidad de un índice secundario, como las query con escaneos de rango y comparaciones de igualdad en la clave del índice clusterizado.

  • Las colecciones con índice clusterizado tienen un tamaño de almacenamiento menor, lo que mejora el rendimiento de las query y las inserciones masivas.

  • Las colecciones con índice clusterizado pueden eliminar la necesidad de un índice secundario TTL (Time To Live).

    • Un índice agrupado también es un índice TTL si especificas el campo expireAfterSeconds.

    • Para ser utilizado como índice TTL, el _id El campo debe ser un tipo de fecha compatible.Consulte Índices TTL.

    • Si usas un índice agrupado como un índice TTL, mejora el rendimiento de eliminación de documentos y reduce el tamaño de almacenamiento de la colección con índice clusterizado.

  • Las colecciones con índices clusterizados tienen mejoras adicionales de rendimiento para actualizaciones, eliminaciones y las query.

    • Todas las colecciones tienen un índice _id.

    • Una colección sin índice clusterizado almacena el índice _id por separado de los documentos. Esto requiere dos escrituras para inserciones, actualizaciones y eliminaciones, y dos lecturas para las query.

    • Una colección con índice clusterizado almacena el índice y los documentos juntos en orden de valor _id. Esto requiere una escritura para las inserciones, actualizaciones y eliminaciones, y otra lectura para las query.

Las colecciones con índice clusterizado almacenan los documentos ordenados según el valor de la clave de índice agrupado. La clave del índice agrupado debe ser { _id: 1 }.

Solo puedes tener un índice agrupado en una colección, porque los documentos solo pueden almacenarse en un orden. Solo las colecciones con un índice agrupado almacenan los datos ordenados.

Puedes tener un índice agrupado y agregar índices secundarios a una colección con índice clusterizado. Los índices agrupados difieren de los índices secundarios:

  • Un índice agrupado solo se puede crear cuando creas la colección.

  • Las claves del índice agrupado se almacenan con la colección. El tamaño de la colección devuelto por el comando collStats incluye el tamaño del índice agrupado.

A partir de MongoDB 6.0.7, si existe un índice agrupado utilizable, el planificador de query de MongoDB evalúa el índice agrupado comparándolo con los índices secundarios en el proceso de planificación de query. Cuando una query utiliza un índice agrupado, MongoDB realiza un escaneo acotado de colección.

Antes de MongoDB 6.0.7, si existía un índice secundario en una colección con índice clusterizado y tu query podía utilizar dicho índice, el planificador de las query seleccionaba el índice secundario en lugar del índice agrupado por defecto. En MongoDB 6.1 y anteriores, para usar el índice agrupado, debes proporcionar una sugerencia porque el optimizador del query no selecciona automáticamente el índice agrupado.

Limitaciones de la colección con índice clusterizado:

  • La clave del índice agrupado debe ser { _id: 1 }.

  • No puedes transformar una colección sin índice clusterizado en una colección con índice clusterizado, ni al revés. En cambio, puedes hacer lo siguiente:

  • No puedes ocultar un índice agrupado. Ver Índices ocultos.

  • Si hay índices secundarios para la colección con índice clusterizado, la colección tiene un tamaño de almacenamiento mayor. Esto se debe a que los índices secundarios de una colección con índice clusterizado con claves de índice grandes pueden tener un tamaño de almacenamiento mayor que los índices secundarios de una colección sin índice clusterizado.

  • La colección con índice clusterizado no puede ser colección con tamaño fijo.

Por defecto, los valores de clave del índice agrupado son los identificadores de objeto únicos de los documentos.

Puedes establecer tus propios valores clave de índice agrupado. Tus valores clave deben seguir las restricciones estándar del campo _id.

Además, utiliza las siguientes prácticas para optimizar el rendimiento:

  • Utiliza valores clave que aumenten secuencialmente para mejorar el rendimiento de las inserciones.

  • Establece tus claves de índice para que sean lo más pequeñas posible.

    • Un índice agrupado soporta claves de hasta 8 MB de tamaño, pero lo mejor es una clave de índice agrupado mucho más pequeña.

    • Las claves grandes aumentan el tamaño de almacenamiento de la colección con índice clusterizado y sus índices secundarios, lo que reduce el rendimiento de la colección con índice clusterizado.

Advertencia

Los valores de clave generados aleatoriamente pueden disminuir el rendimiento de una colección con índice clusterizado.

Esta sección muestra ejemplos de colección con índice clusterizado.

El siguiente ejemplo create agrega una colección con índice clusterizado denominada products:

db.runCommand( {
create: "products",
clusteredIndex: { "key": { _id: 1 }, "unique": true, "name": "products clustered key" }
} )

En el ejemplo, clusteredIndex indica:

  • "key": { _id: 1 }, que establece la clave del índice agrupado en el campo _id.

  • "unique": true, lo que indica que el valor de la clave del índice agrupado debe ser único.

  • "name": "products clustered key", que define el nombre del índice clúster.

El siguiente ejemplo db.createCollection() agrega una colección con índice clusterizado denominada stocks:

db.createCollection(
"stocks",
{ clusteredIndex: { "key": { _id: 1 }, "unique": true, "name": "stocks clustered key" } }
)

En el ejemplo, clusteredIndex indica:

  • "key": { _id: 1 }, que establece la clave del índice agrupado en el campo _id.

  • "unique": true, lo que indica que el valor de la clave del índice agrupado debe ser único.

  • "name": "stocks clustered key", que define el nombre del índice clúster.

El siguiente ejemplo create agrega una colección con índice clusterizado denominada orders:

db.createCollection(
"orders",
{ clusteredIndex: { "key": { _id: 1 }, "unique": true, "name": "orders clustered key" } }
)

En el ejemplo, clusteredIndex indica:

  • "key": { _id: 1 }, que establece la clave del índice agrupado en el campo _id.

  • "unique": true, lo que indica que el valor de la clave del índice agrupado debe ser único.

  • "name": "orders clustered key", que define el nombre del índice clúster.

El siguiente ejemplo añade documentos a la colección orders:

db.orders.insertMany( [
{ _id: ISODate( "2022-03-18T12:45:20Z" ), "quantity": 50, "totalOrderPrice": 500 },
{ _id: ISODate( "2022-03-18T12:47:00Z" ), "quantity": 5, "totalOrderPrice": 50 },
{ _id: ISODate( "2022-03-18T12:50:00Z" ), "quantity": 1, "totalOrderPrice": 10 }
] )

La clave _id clusteredIndex almacena la fecha del pedido.

Si usas el campo _id en una query por rango, el rendimiento mejora. Por ejemplo, la siguiente query utiliza _id y $gt para devolver los pedidos cuya fecha de pedido sea mayor que la fecha suministrada:

db.orders.find( { _id: { $gt: ISODate( "2022-03-18T12:47:00.000Z" ) } } )

Ejemplo de salida:

[
{
_id: ISODate( "2022-03-18T12:50:00.000Z" ),
quantity: 1,
totalOrderPrice: 10
}
]

Para determinar si una colección está agrupada, utiliza el comando listCollections:

db.runCommand( { listCollections: 1 } )

Para las colecciones con índice clusterizado, verás los detalles de clusteredIndex en el resultado. Por ejemplo, el siguiente resultado muestra los detalles de la colección con índice clusterizado orders:

...
name: 'orders',
type: 'collection',
options: {
clusteredIndex: {
v: 2,
key: { _id: 1 },
name: 'orders clustered key',
unique: true
}
},
...

v es la versión del índice.

Volver

Modificar los límites

En esta página