Crear Índices en MongoDB

MongoDBBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá las técnicas fundamentales para crear y gestionar índices en MongoDB. Los índices son cruciales para optimizar el rendimiento de la base de datos, ya que permiten a la base de datos encontrar y recuperar datos mucho más rápido que escaneando cada documento en una colección. Practicará la creación de índices de campo único, compuestos y únicos, analizará su impacto en el rendimiento de las consultas y gestionará su ciclo de vida. Al final de este laboratorio, tendrá una sólida comprensión de cómo utilizar los índices para hacer que sus consultas de MongoDB sean más eficientes.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 100%. Ha recibido una tasa de reseñas positivas del 93% por parte de los estudiantes.

Crear un Índice de Campo Único

En este primer paso, se conectará a MongoDB, creará una base de datos con una colección de ejemplo y luego creará su primer índice en un campo único. Un índice de campo único mejora el rendimiento de las consultas que filtran o ordenan por ese campo específico.

Primero, abra la Shell de MongoDB escribiendo mongosh en su terminal. Esto lo conectará al servidor MongoDB que se ejecuta en su entorno.

mongosh

Una vez que esté dentro de la Shell de MongoDB, verá un prompt >. Creemos y cambiemos a una nueva base de datos llamada indexlab. Todos los comandos subsiguientes en este laboratorio se ejecutarán dentro de esta shell a menos que se indique lo contrario.

use indexlab

Ahora, insertemos algunos documentos de ejemplo en una nueva colección llamada users. Estos datos se utilizarán a lo largo del laboratorio.

db.users.insertMany([
  { name: "Alice", age: 28, email: "alice@example.com" },
  { name: "Bob", age: 35, email: "bob@example.com" },
  { name: "Charlie", age: 42, email: "charlie@example.com" }
]);

Con nuestros datos en su lugar, creemos un índice en el campo name. Un índice en un solo campo ayuda a acelerar las consultas que buscan documentos por ese campo.

db.users.createIndex({ name: 1 });

En el comando anterior, { name: 1 } especifica que el índice debe crearse en el campo name en orden ascendente. Usar -1 crearía un índice descendente.

Para verificar que el índice se creó, puede listar todos los índices de la colección users.

db.users.getIndexes();

Debería ver dos índices en la salida. Uno es el índice predeterminado _id creado por MongoDB en cada colección, y el otro es el índice name_1 que acaba de crear.

[
  { "v": 2, "key": { "_id": 1 }, "name": "_id_" },
  { "v": 2, "key": { "name": 1 }, "name": "name_1" }
]

Crear un Índice Compuesto

Si bien los índices de campo único son útiles, muchas consultas filtran por varios campos. Para estos casos, un índice compuesto, que incluye varios campos, puede proporcionar una mejora significativa del rendimiento. En este paso, creará un índice compuesto.

Continuemos en la shell mongosh. Crearemos un índice compuesto en los campos age y name. El orden de los campos en un índice compuesto es importante. MongoDB puede utilizar este índice para admitir consultas solo por age, o por age y luego name.

db.users.createIndex({ age: -1, name: 1 });

Este comando crea un índice que primero ordena los documentos por age en orden descendente (-1) y luego, para los documentos con la misma edad, los ordena por name en orden ascendente (1).

Agreguemos algunos documentos más para hacer nuestra colección más diversa para las consultas.

db.users.insertMany([
  { name: "David", age: 28, email: "david@example.com" },
  { name: "Eve", age: 35, email: "eve@example.com" }
]);

Ahora, vuelva a ver la lista de índices para ver su nuevo índice compuesto.

db.users.getIndexes();

La salida ahora incluirá el índice age_-1_name_1, además de los anteriores.

[
  { "v": 2, "key": { "_id": 1 }, "name": "_id_" },
  { "v": 2, "key": { "name": 1 }, "name": "name_1" },
  { "v": 2, "key": { "age": -1, "name": 1 }, "name": "age_-1_name_1" }
]

Este índice compuesto servirá eficientemente a las consultas que filtren u ordenen por age, o por age y luego name.

Crear un Índice Único

Los índices también se pueden utilizar para garantizar la integridad de los datos. Un índice único asegura que el campo (o campos) indexado no contenga valores duplicados. En este paso, creará un índice único para evitar direcciones de correo electrónico duplicadas en la colección users.

Creemos un índice único en el campo email. Esto se hace agregando la opción { unique: true } al crear el índice.

db.users.createIndex({ email: 1 }, { unique: true });

Ahora que el índice único está implementado, MongoDB rechazará cualquier intento de insertar o actualizar un documento si resulta en un valor duplicado para el campo email.

Probemos esto. Primero, intente insertar un documento con un correo electrónico nuevo y único. Esto debería tener éxito.

db.users.insertOne({ name: "Frank", age: 31, email: "frank@example.com" });

A continuación, intente insertar otro documento con un correo electrónico existente, como alice@example.com. Esta operación fallará. El bloque try...catch le permite ver el error sin desconectarse de la shell mongosh.

try {
  db.users.insertOne({ name: "Fiona", age: 29, email: "alice@example.com" });
} catch (e) {
  print(e);
}

El comando generará un error que indica una violación de clave duplicada. La salida contendrá un mensaje como E11000 duplicate key error collection.

Puede volver a ver sus índices para ver la propiedad de restricción única.

db.users.getIndexes();

Observe la propiedad unique: true en el índice email_1 en la salida.

[
  ...,
  {
    v: 2,
    key: { email: 1 },
    name: 'email_1',
    unique: true
  }
]

Analizar Uso de Índices con explain()

Crear índices es solo la mitad de la batalla; también necesitas verificar que MongoDB los esté utilizando realmente para tus consultas. El método explain() es una herramienta poderosa para esto, ya que proporciona información detallada sobre cómo se ejecuta una consulta. Este paso te mostrará cómo usar explain() para verificar que MongoDB está utilizando tus índices existentes de manera efectiva.

Analicemos una consulta que busca usuarios de cierta edad. Dado que ya tenemos el índice compuesto age_-1_name_1 del paso anterior, MongoDB puede usar este índice para optimizar la consulta en el campo age.

db.users.find({ age: 35 }).explain("executionStats");

En la salida, busca el campo executionStats.stage dentro de winningPlan. Deberías ver un valor de IXSCAN, que significa "Index Scan" (Escaneo de Índice). Esto indica que MongoDB está utilizando el índice compuesto existente age_-1_name_1 para localizar rápidamente los documentos relevantes. También deberías ver que totalDocsExamined coincide con el número de documentos devueltos, lo que demuestra la eficiencia del uso del índice compuesto.

Para comprender mejor cómo MongoDB elige los índices, probemos también una consulta que puede beneficiarse del índice de campo único name que creamos anteriormente.

db.users.find({ name: "Alice" }).explain("executionStats");

Esta consulta también debería mostrar IXSCAN como la etapa del plan ganador, confirmando que MongoDB está utilizando el índice name_1 que creamos en el primer paso.

Ver y Eliminar Índices

La parte final de la gestión de índices es saber cómo listarlos y eliminarlos cuando ya no son necesarios. Los índices no utilizados todavía consumen almacenamiento y añaden sobrecarga a las operaciones de escritura, por lo que es una buena práctica eliminarlos.

Primero, obtengamos una lista completa de todos los índices que ha creado hasta ahora en la colección users.

db.users.getIndexes();

Este comando proporciona una visión general completa de su configuración de índices actual. Supongamos que decide que el índice compuesto age_-1_name_1 ya no es necesario. Puede eliminarlo utilizando el método dropIndex(), especificando el nombre del índice.

db.users.dropIndex("age_-1_name_1");

Después de ejecutar el comando, recibirá un mensaje de confirmación. Para estar seguro, puede listar los índices una vez más para verificar que se ha eliminado.

db.users.getIndexes();

El índice age_-1_name_1 ya no debería aparecer en la lista.

Si necesita eliminar todos los índices personalizados de una colección (excepto el índice predeterminado _id), puede usar el método dropIndexes(). Este comando es potente, así que úselo con cuidado.

// Example: db.users.dropIndexes()

Esto concluye las operaciones básicas para gestionar índices en MongoDB. Ahora puede salir de la shell mongosh.

exit;

Resumen

En este laboratorio, ha aprendido las habilidades esenciales para trabajar con índices de MongoDB. Comenzó creando un índice básico de un solo campo para acelerar consultas simples. Luego, avanzó a la creación de un índice compuesto para optimizar consultas que involucran múltiples campos. También aprendió a hacer cumplir la integridad de los datos creando un índice único. Además, utilizó el método explain() para analizar planes de consulta y confirmar que sus índices se estaban utilizando de manera efectiva, observando la diferencia de rendimiento entre un escaneo de colección y un escaneo de índice. Finalmente, practicó la gestión de sus índices listándolos y eliminándolos. Dominar estas técnicas de indexación es un paso crítico para construir aplicaciones rápidas y escalables con MongoDB.