Índices en colecciones - mejor rendimiento en consultas
Los índices en MongoDB son herramientas para optimizar el rendimiento de tus consultas. Si no los usas correctamente, tu aplicación puede volverse lenta a medida que tus colecciones crecen.
En este post veremos:
- Qué es un índice en MongoDB
- Cuándo debes usar índices
- Cómo crear índices con
createIndex() - Cómo analizar el rendimiento con
explain()
¿Qué es un índice en MongoDB?
Un índice es una estructura especial que MongoDB crea para acelerar las búsquedas dentro de una colección. En vez de recorrer todos los documentos (lo que se llama scan), MongoDB usa el índice para ir directo al dato.
Ejemplo real:
Si tienes una colección de usuarios:
1
2
3
4
5
6
{
_id: ObjectId("..."),
nombre: "María",
email: "maria@mail.com",
edad: 27
}
Si buscas por email, sin índice MongoDB tendría que revisar cada documento. Con índice, MongoDB va directo a los documentos que coinciden.
¿Cuándo debes usar índices?
Usa índices cuando:
- Haces consultas frecuentes por un campo específico
- Ordenas resultados (
sort()) por un campo - Filtras por rangos (
$gt,$lt,$in) - Buscas por campos únicos (como email o username)
- Usas consultas que se repiten en tu app
Ejemplo típico:
1
db.usuarios.find({ email: "maria@mail.com" })
Si no hay índice en email, esta consulta será lenta cuando la colección crezca.
Crear índices con createIndex()
Índice simple (1 campo)
1
db.usuarios.createIndex({ email: 1 })
El 1 significa orden ascendente.
Índice compuesto (varios campos)
1
db.ordenes.createIndex({ usuarioId: 1, fecha: -1 })
Esto es útil cuando haces consultas como:
1
db.ordenes.find({ usuarioId: 123 }).sort({ fecha: -1 })
Índice único
1
db.usuarios.createIndex({ email: 1 }, { unique: true })
Esto evita que haya dos usuarios con el mismo email.
Analizar el rendimiento con explain()
Para saber si una consulta usa índice o no, usa explain():
1
db.usuarios.find({ email: "maria@mail.com" }).explain("executionStats").queryPlanner.winningPlan
Si ves algo como:
COLLSCANsignifica que está recorriendo toda la colección (malo)IXSCANestá usando índice (bueno)
Ejemplo:
mi_app> db.usuarios.find({ email: "maria@mail.com" }).explain("executionStats").queryPlanner.winningPlan
{
stage: 'COLLSCAN',
filter: { email: { '$eq': 'maria@mail.com' } },
direction: 'forward'
}
mi_app> db.usuarios.createIndex({ email: 1 })
email_1
mi_app> db.usuarios.find({ email: "maria@mail.com" }).explain("executionStats").queryPlanner.winningPlan
{
stage: 'FETCH',
inputStage: {
stage: 'IXSCAN',
keyPattern: { email: 1 },
indexName: 'email_1',
isMultiKey: false,
multiKeyPaths: { email: [] },
isUnique: false,
isSparse: false,
isPartial: false,
indexVersion: 2,
direction: 'forward',
indexBounds: { email: [ '["maria@mail.com", "maria@mail.com"]' ] }
}
}
Buenas prácticas con índices
Crea índices en los campos que usas frecuentemente en consultas, como identificadores (email, username, userId) y campos de filtrado o ordenamiento (fecha, estado).
Usa índices compuestos cuando haces consultas con varios filtros
Los índices ocupan espacio y pueden afectar el rendimiento de inserciones y actualizaciones, pero son útiles y casi siempre necesarios porque hacen que las consultas sean MUCHO más rápidas.
Los índices en MongoDB son clave para que tus consultas sean rápidas y escalables. Con un buen diseño de índices, tu app puede manejar colecciones grandes sin problemas.