Database Management

Dominando Índices Compuestos en MongoDB

Spread the love

Dominando Índices Compuestos en MongoDB

Esta guía profundiza en las complejidades de los índices compuestos en MongoDB, una técnica crucial para optimizar el rendimiento de la base de datos. Cubriremos todo, desde comprender su funcionamiento fundamental hasta analizar su efectividad y solucionar problemas comunes.

  1. Entendiendo los Índices Compuestos
  2. Creando Índices Compuestos
  3. Consultas con Índices Compuestos
  4. Analizando el Uso de Índices
  5. Mejores Prácticas y Optimización
  6. Preguntas Frecuentes

1. Entendiendo los Índices Compuestos

En MongoDB, un índice compuesto es un índice que abarca múltiples campos dentro de un solo documento. A diferencia de los índices de un solo campo, que solo aceleran las consultas en un solo campo, los índices compuestos aumentan drásticamente la velocidad de las consultas que involucran múltiples campos, impactando significativamente el rendimiento de la aplicación. El orden de los campos dentro del índice es crítico; MongoDB utiliza este orden para localizar eficientemente los documentos.

Las consultas que coinciden con los campos principales del índice obtienen el mayor beneficio. Si una consulta utiliza solo los campos principales, el índice se utiliza completamente tanto para el filtrado como para la ordenación. Sin embargo, si una consulta utiliza campos más allá del índice, MongoDB podría utilizar parcialmente el índice, potencialmente recurriendo a un escaneo de la colección para los criterios restantes, negando las ganancias de rendimiento.

Por ejemplo, considere una colección products con los campos category, price y name. Un índice compuesto en { "category": 1, "price": -1 } optimiza las consultas que filtran por category y luego ordenan por price en orden descendente.

2. Creando Índices Compuestos

Crear índices compuestos es sencillo usando el método db.collection.createIndex(). El argumento es un documento donde las claves representan los nombres de los campos y los valores representan el orden de clasificación (1 para ascendente, -1 para descendente).


// Crear un índice compuesto en categoría (ascendente) y precio (descendente)
db.products.createIndex( { category: 1, price: -1 } );

// Crear un índice compuesto en múltiples campos, con diferentes órdenes de clasificación
db.users.createIndex( { firstName: 1, lastName: -1, age: 1 } );

// Agregar opciones únicas y dispersas
db.products.createIndex( { category: 1, price: -1 }, { unique: true, sparse: true } );

unique: true impone la unicidad en los campos indexados, mientras que sparse: true indexa solo los documentos donde los campos indexados no son nulos.

3. Consultas con Índices Compuestos

El optimizador de consultas de MongoDB utiliza automáticamente un índice compuesto si la consulta coincide con los campos principales y el orden de clasificación se alinea. Por ejemplo, la siguiente consulta se beneficia del índice { "category": 1, "price": -1 }:


db.products.find( { category: "Electronics" } ).sort( { price: -1 } );

Esta consulta filtra por category (el campo principal del índice) y ordena por price (que coincide con el orden de clasificación del índice). Sin embargo, esta consulta no se beneficiaría tanto:


db.products.find( { price: { $lt: 100 } } ).sort( { category: 1 } );

price no es el campo principal, y el orden de clasificación no se alinea con el índice.

4. Analizando el Uso de Índices

Utilice db.collection.find().explain() para analizar el uso del índice. Esto proporciona información detallada sobre el plan de ejecución de la consulta, incluyendo qué índices se utilizaron (o no) y los tiempos de ejecución.


db.products.find( { category: "Electronics" } ).sort( { price: -1 } ).explain();

Examine la sección «executionStats». Si se utiliza el índice, verá el uso de la clave del índice y el número de documentos examinados. «COLLSCAN» indica un escaneo completo de la colección, menos eficiente que el uso del índice.

5. Mejores Prácticas y Optimización

La selección cuidadosa del índice es crucial. El sobre-indexado ralentiza las operaciones de escritura, mientras que el sub-indexado conduce a consultas ineficientes. Priorice los patrones de consulta utilizados con frecuencia, agregando índices incrementalmente según sea necesario. Supervise el uso del índice regularmente y ajústelo según las necesidades de la aplicación. Considere usar la GUI de MongoDB Compass para una administración de índices más sencilla.

6. Preguntas Frecuentes

  • ¿Cuántos índices compuestos debo crear? El número óptimo depende de los patrones de consulta de su aplicación. Se necesita un equilibrio para evitar el sobre-indexado.
  • ¿Qué pasa si mi consulta no coincide perfectamente con el índice? MongoDB podría usar partes del índice, pero aún podría recurrir a un escaneo de la colección para las partes que no coinciden.
  • ¿Puedo crear índices compuestos con campos ascendentes/descendentes mixtos? Sí, el orden es crucial para un rendimiento óptimo.
  • ¿Cómo elimino un índice compuesto? Use db.collection.dropIndex(), especificando el nombre del índice o la especificación:

// Eliminar por nombre
db.products.dropIndex("category_1_price_-1");

// Eliminar por especificación
db.products.dropIndex( { category: 1, price: -1 } );

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *