Bases de datos nosql
1. ¿Qué son los índices y por qué son importantes?
Un índice en una base de datos es como el índice de un libro 📖:
- Sin índice 📕: Para encontrar un tema, debes leer todas las páginas hasta encontrarlo.
- Con índice 📖: Buscas en la lista de temas y vas directo a la página correcta.
👉 En bases documentales, los índices aceleran la búsqueda de datos, evitando que la base de datos tenga que revisar todos los documentos.
📌 Ejemplo sin índice:
1db.productos.find({ nombre: "Laptop" })
Si hay 1 millón de productos, MongoDB revisará todos los documentos para encontrar las coincidencias. Esto es muy lento.
📌 Ejemplo con índice:
1db.productos.createIndex({ nombre: 1 })
Ahora, cuando buscamos "Laptop", MongoDB usa el índice y encuentra el dato rápidamente ✅.
2. Crear un Índice en MongoDB
Podemos crear índices en cualquier campo con el comando createIndex().
📌 Ejemplo: Índice en el campo nombre
1db.productos.createIndex({ nombre: 1 })
🔹 ¿Qué significa { nombre: 1 }?
1→ Índice ascendente (de A a Z o de menor a mayor).-1→ Índice descendente (de Z a A o de mayor a menor).
📌 Ejemplo: Índice en precio, ordenado de mayor a menor
1db.productos.createIndex({ precio: -1 })
✅ Ahora las búsquedas en nombre o precio serán mucho más rápidas.
3. Ver los Índices Creados
Para ver todos los índices de una colección, usamos:
1db.productos.getIndexes()
Esto mostrará los índices existentes en la colección.
4. Tipos de Índices en MongoDB
| Tipo de Índice | Descripción | Ejemplo |
|---|---|---|
| Índice simple | Acelera la búsqueda en un solo campo | { nombre: 1 } |
| Índice compuesto | Mejora búsquedas en múltiples campos | { marca: 1, precio: -1 } |
| Índice único | Evita datos duplicados | { email: 1 }, unique: true |
| Índice parcial | Solo indexa ciertos documentos | { stock: 1 }, partialFilterExpression: { stock: { $gt: 0 } } |
| Índice de texto | Para búsquedas de palabras clave | { descripcion: "text" } |
| Índice geoespacial | Para búsquedas de ubicación | { ubicacion: "2dsphere" } |
5. Índices Compuestos (para varias columnas)
Si buscamos frecuentemente por marca y precio, podemos crear un índice compuesto:
1db.productos.createIndex({ marca: 1, precio: -1 })
✅ Ahora, las búsquedas que usen ambos campos serán más rápidas.
6. Índices Únicos (Evitar Datos Duplicados)
Si queremos que los correos electrónicos de los usuarios sean únicos, creamos un índice así:
1db.usuarios.createIndex({ email: 1 }, { unique: true })
Si alguien intenta insertar dos usuarios con el mismo email, MongoDB lo rechazará.
7. Índices de Texto (Búsqueda en Descripciones)
Si queremos buscar productos por descripción, usamos un índice de texto:
1db.productos.createIndex({ descripcion: "text" })
Ahora podemos buscar productos con ciertas palabras clave:
1db.productos.find({ $text: { $search: "rápido ligero" } })
✅ MongoDB buscará productos que contengan esas palabras en la descripción.
8. Índices Geoespaciales (Ubicaciones en un Mapa)
Si queremos buscar negocios cercanos en un mapa, usamos un índice geoespacial:
1db.negocios.createIndex({ ubicacion: "2dsphere" })
Ejemplo de búsqueda de negocios en un radio de 1 km:
1db.negocios.find({ 2 ubicacion: { 3 $near: { 4 $geometry: { type: "Point", coordinates: [40.4168, -3.7038] }, 5 $maxDistance: 1000 6 } 7 } 8})
✅ Útil para apps de mapas, delivery y transporte 🚗.
9. Optimización de Consultas
A veces, las consultas son lentas porque no usan los índices correctamente.
📌 Ver el rendimiento de una consulta con .explain()
1db.productos.find({ nombre: "Laptop" }).explain("executionStats")
Si el campo "IXSCAN" aparece en los resultados, significa que MongoDB usó un índice ✅.
Si aparece "COLLSCAN", significa que MongoDB revisó todos los documentos ❌.
👉 Si una consulta es lenta, revisa si hay un índice adecuado.
10. Eliminar Índices Innecesarios
Si ya no necesitamos un índice, podemos eliminarlo con:
1db.productos.dropIndex("nombre_1")
📌 Ver todos los índices antes de eliminarlos:
1db.productos.getIndexes()