Tabla de contenido

Cuando tu aplicación crece y tu base de datos empieza a tener miles o millones de registros, las consultas que antes eran instantáneas de repente tardan varios segundos. En ese momento, los índices en MySQL se convierten en tu mejor herramienta de optimización.

¿Qué es un índice en MySQL?

Un índice en MySQL es una estructura de datos adicional que MySQL mantiene en paralelo a tu tabla y que permite encontrar registros de forma mucho más rápida, sin tener que revisar cada fila de la tabla.

Una analogía que funciona muy bien: imagina un libro de texto sin índice al final. Si quieres encontrar todas las páginas donde se habla de “JavaScript”, tienes que leer el libro completo página por página. Con un índice al final del libro, simplemente buscas “JavaScript” en orden alfabético y te dice exactamente en qué páginas está. Eso mismo hace un índice en una base de datos.

¿Por qué usar índices?

Sin índices, cuando ejecutas una consulta como esta:

SELECT * FROM usuarios WHERE correo = 'hola@8devmx.com';

SQL

MySQL tiene que revisar cada fila de la tabla usuarios hasta encontrar todas las que coincidan. A esto se le llama full table scan y es muy costoso en tablas grandes.

Con un índice en la columna correo, MySQL puede encontrar el registro directamente sin revisar toda la tabla, lo que puede reducir el tiempo de consulta de segundos a milisegundos.

Tipos de índices en MySQL

MySQL tiene varios tipos de índices, pero los más importantes que debes conocer son:

PRIMARY KEY: Es el índice más importante. Cada tabla debería tener uno y define la columna (o columnas) que identifican de forma única cada registro. MySQL lo crea automáticamente cuando defines una llave primaria.

CREATE TABLE usuarios (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(100),
  correo VARCHAR(150)
);

SQL

INDEX (o KEY): Un índice regular para acelerar búsquedas en una columna. Puede haber valores duplicados.

UNIQUE INDEX: Similar al índice regular, pero garantiza que todos los valores en esa columna sean únicos, como un correo electrónico.

FULLTEXT INDEX: Diseñado para búsquedas de texto completo. Útil cuando necesitas buscar palabras dentro de columnas de tipo TEXT.

Cómo crear un índice

Puedes crear un índice al momento de crear la tabla:

CREATE TABLE productos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(200),
  categoria_id INT,
  precio DECIMAL(10,2),
  INDEX idx_categoria (categoria_id),
  UNIQUE INDEX idx_nombre (nombre)
);

SQL

O puedes agregar un índice a una tabla existente:

ALTER TABLE usuarios ADD INDEX idx_correo (correo);
ALTER TABLE usuarios ADD UNIQUE INDEX idx_correo_unico (correo);
CREATE INDEX idx_correo ON usuarios (correo);

SQL

Índices compuestos: Puedes crear un índice sobre múltiples columnas cuando frecuentemente buscas por varias condiciones juntas:

CREATE INDEX idx_nombre_ciudad ON usuarios (nombre, ciudad);

SQL

Cómo ver los índices de una tabla

Para ver qué índices tiene una tabla, usa:

SHOW INDEX FROM usuarios;

SQL

También puedes usar EXPLAIN para ver si MySQL está usando un índice en una consulta específica:

EXPLAIN SELECT * FROM usuarios WHERE correo = 'hola@8devmx.com';

SQL

Revisa la columna key en el resultado: si aparece el nombre de un índice, MySQL lo está usando. Si dice NULL, está haciendo un full table scan.

¿Cuándo NO usar índices?

Los índices no son gratuitos. Aunque aceleran las lecturas, tienen un costo:

  1. Ocupan espacio en disco: Cada índice es una estructura adicional que se almacena.
  2. Ralentizan escrituras: Cuando insertas, actualizas o eliminas registros, MySQL también tiene que actualizar todos los índices de esa tabla.

Los índices tienen más sentido en columnas que:

  • Se usan frecuentemente en cláusulas WHERE
  • Se usan en JOIN entre tablas
  • Se usan en ORDER BY o GROUP BY
  • Tienen alta cardinalidad (muchos valores distintos)

Evita indexar columnas que se modifican constantemente o que tienen muy poca variedad de valores (como una columna status con solo 2 o 3 valores posibles).

Con esta base ya puedes empezar a optimizar tus bases de datos de forma inteligente. El uso correcto de índices es una de las diferencias más grandes entre una base de datos lenta y una que responde de forma ágil.