9. Índices y rendimiento

Los índices mejoran drásticamente el rendimiento de las consultas.

¿Qué es un índice?

Un índice es una estructura de datos especial que almacena una pequeña porción de los datos de forma fácil de recorrer. Es como el índice de un libro.

Sin índice, MongoDB debe escanear toda la colección (collection scan). Con índice, MongoDB puede ir directamente a los documentos relevantes.

Ver índices

Para ver los índices de una colección:

db.unicorns.getIndexes()

Por defecto, todas las colecciones tienen un índice en _id.

Crear índices

Para crear un índice simple:

// Índice en el campo name
db.unicorns.createIndex({ name: 1 })
  • 1 = orden ascendente
  • -1 = orden descendente

Para índices simples, el orden no importa. Para índices compuestos, sí.

Índices compuestos

Puedes crear índices en múltiples campos:

db.unicorns.createIndex({ gender: 1, vampires: -1 })

Este índice es útil para consultas que filtran por gender y/o ordenan por vampires.

Índices únicos

Para garantizar que no haya duplicados:

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

Ahora no podrás insertar dos usuarios con el mismo email.

Eliminar índices

Para eliminar un índice:

db.unicorns.dropIndex({ name: 1 })

Para eliminar todos los índices excepto _id:

db.unicorns.dropIndexes()

Analizar consultas con explain

Para ver si una consulta usa índices:

db.unicorns.explain().find({ name: 'Aurora' })

Busca el campo winningPlan:

  • COLLSCAN = escaneo completo (malo, lento)
  • IXSCAN = usa índice (bueno, rápido)

Índices en arrays

Puedes crear índices en campos que son arrays:

db.unicorns.createIndex({ loves: 1 })

Esto crea un índice multikey que indexa cada valor del array.

Índices en campos embebidos

Puedes crear índices en campos de documentos embebidos:

db.users.createIndex({ 'address.city': 1 })

Nota la notación de punto entre comillas.

Cuándo crear índices

Crea índices cuando:

  • Consultas lentas: si una consulta tarda mucho
  • Campos de búsqueda: si filtras frecuentemente por un campo
  • Ordenación: si ordenas frecuentemente por un campo

No creas índices innecesarios:

  • Ralentizan las escrituras (INSERT, UPDATE, DELETE)
  • Ocupan espacio en disco
  • Cada índice consume memoria

Estadísticas de colección

Para ver estadísticas de una colección:

db.unicorns.stats()

Verás información sobre:

  • Número de documentos
  • Tamaño de los datos
  • Tamaño de los índices
Actividad 1
  1. Crea un índice en el campo weight
  2. Crea un índice compuesto en gender y vampires
  3. Usa explain para ver si tu consulta usa índices: db.unicorns.find({ weight: { $gt: 500 } })
  4. Elimina el índice de weight
  5. Vuelve a hacer explain en la misma consulta. ¿Ves la diferencia?

This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.

Desafíos de programación atemporales y multiparadigmáticos

Desafíos de programación atemporales y multiparadigmáticos

Te encuentras ante un librillo de actividades, divididas en 2 niveles de dificultad. Te enfrentarás a los casos más comunes que te puedes encontrar en pruebas técnicas o aprender conceptos elementales de programación.

Buy the book

Will you buy me a coffee?

Comments

There are no comments yet.

Visitors in real time

You are alone: 🐱