Índice MongoDB

Los índices generalmente pueden mejorar enormemente la eficiencia de las consultas. Sin índices, MongoDB debe escanear cada documento de la colección al leer los datos y seleccionar aquellos registros que cumplan las condiciones de la consulta.

La eficiencia de consulta de escanear toda la colección es muy baja, especialmente al procesar grandes cantidades de datos; la consulta puede tardar decenas de segundos o incluso minutos, lo cual es muy perjudicial para el rendimiento del sitio web.

Un índice es una estructura de datos especial. El índice se almacena en un conjunto de datos fácil de recorrer y leer. Un índice es una estructura que ordena los valores de una o más columnas en una tabla de base de datos.

En MongoDB, los tipos de índices comunes incluyen:

  • Índice de campo único: Índice basado en un solo campo.
  • Índice compuesto: Índice basado en la combinación de múltiples campos.
  • Índice de texto: Se usa para admitir búsquedas de texto completo.
  • Índice geoespacial: Se usa para consultas de datos geoespaciales.
  • Índice hash: Índice que aplica hash a los valores de un campo.

Crear índice

MongoDB utiliza el método createIndex() para crear índices.

Nota: antes de la versión 3.0.0, el método para crear índices era db.collection.ensureIndex(); en versiones posteriores se usa db.collection.createIndex(). ensureIndex() todavía se puede usar, pero es solo un alias de createIndex().

Sintaxis

El formato de sintaxis básica del método createIndex() es el siguiente:

db.collection.createIndex( keys, options )
  • db: Referencia a la base de datos.
  • collection: Nombre de la colección.
  • keys: Un objeto que especifica el nombre del campo y la dirección de ordenación del índice (1 significa ascendente, -1 descendente).
  • options: Un parámetro opcional que puede contener opciones adicionales del índice.

El parámetro options es un objeto que puede contener varias opciones de configuración. A continuación se muestran algunas opciones comunes:

  • unique: Si se establece entrue, se crea un índice único para garantizar que los valores del campo indexado sean únicos en la colección.
  • background: Si se establece entrue, el proceso de creación del índice se ejecuta en segundo plano sin afectar otras operaciones de la base de datos.
  • name: Especifica el nombre del índice; si no se especifica, MongoDB genera automáticamente un nombre basado en los campos del índice.
  • sparse: Si se establece entrue, se crea un índice disperso que solo indexa los documentos que contienen el campo indexado.
  • expireAfterSeconds: Establece el tiempo de expiración del campo indexado; MongoDB eliminará automáticamente los documentos expirados.
  • v: Versión del índice, normalmente no es necesario configurarla manualmente.
  • weights: Especifica la ponderación para el índice de texto.

Ejemplo

// Crear un índice ascendente en el campo age
db.myCollection.createIndex({ age: 1 });
// Crear un índice de texto en el campo name
db.myCollection.createIndex({ name: "text" });

Ejemplo

Creación de índices:

Ejemplo

// Crear un índice único
db.collection.createIndex( { field: 1 }, { unique: true } )

// Crear un índice que se ejecuta en segundo plano
db.collection.createIndex( { field: 1 }, { background: true } )

// Crear un índice disperso
db.collection.createIndex( { field: 1 }, { sparse: true } )

// Crear un índice de texto y especificar la ponderación
db.collection.createIndex( { field: "text" }, { weights: { field: 10 } } )
Crear índice geoespacial
Para campos que almacenan datos de ubicación geográfica, se puede utilizar el tipo de índice 2dsphere o 2d para crear un índice geoespacial.

// Índice 2dsphere, adecuado para datos geográficos esféricos
db.collection.createIndex( { location: "2dsphere" } )

// Índice 2d, adecuado para datos geográficos planos
db.collection.createIndex( { location: "2d" } )

Crear índice hash

A partir de la versión 3.2 de MongoDB, se puede usar un índice hash para aplicar hash a los campos y así admitir búsquedas numéricas de amplio rango.

db.collection.createIndex( { field: "hashed" } )

Ver índices

Se puede usar el método getIndexes() para ver todos los índices de la colección:

db.collection.getIndexes()

Eliminar índices

Se pueden eliminar índices con los métodos dropIndex() o dropIndexes():

Ejemplo

// Eliminar el índice especificado
db.collection.dropIndex( "indexName" )

// Eliminar todos los índices
db.collection.dropIndexes()

Estrategia de índices

Al crear índices, se deben considerar los siguientes factores:

  • Frecuencia de consulta: Priorizar los campos que se usan con frecuencia en las consultas.
  • Cardinalidad del campo: Cuanto mayor sea la cardinalidad del valor del campo (es decir, cuantos más valores únicos), mejor será el efecto del índice.
  • Tamaño del índice: El tamaño del índice afecta el uso de memoria de la base de datos y el rendimiento de las consultas.

Optimización de índices

Al optimizar los índices, se pueden considerar los siguientes métodos:

  • Elegir el tipo de índice adecuado: Elegir el tipo de índice adecuado según las necesidades de la consulta.
  • Crear índices compuestos: Para campos que se usan con frecuencia juntos, considere crear un índice compuesto para mejorar la eficiencia de las consultas.
  • Monitorear el rendimiento del índice: Supervisar periódicamente el uso de los índices y ajustarlos según las necesidades reales.

Consideraciones

  • Aunque los índices pueden mejorar el rendimiento de las consultas, también aumentan la sobrecarga de las operaciones de escritura. Por lo tanto, al crear índices es necesario equilibrar el rendimiento de las consultas y el de escritura.
  • Los índices ocupan espacio de almacenamiento adicional, especialmente en conjuntos de datos grandes, por lo que se debe considerar el costo de almacenamiento de los índices.

Mediante un diseño y uso razonables de los índices, se puede mejorar en gran medida el rendimiento de las consultas y la velocidad de respuesta de la base de datos MongoDB, apoyando así mejor las necesidades de las aplicaciones.

Otras extensiones