Índices en MySQL: qué son, cómo funcionan y cuándo usarlos


Una consulta puede funcionar perfecto con 100 filas y volverse lenta con 10 millones. Los índices ayudan a encontrar registros más eficientemente.

¿Qué es un índice?

Es una estructura auxiliar que organiza ciertos valores para que el motor pueda localizar filas sin recorrer necesariamente toda la tabla.

Es parecido al índice de un libro: no reemplaza el contenido, pero ayuda a encontrarlo.

¿Cómo busca MySQL sin un índice útil?

Una posibilidad es recorrer fila por fila y comprobar la condición. Esto se conoce como table scan o recorrido completo.

Con 50 filas puede ser irrelevante. Con millones de filas, puede ser costoso.

Consulta sin índice

SELECT *
FROM clientes
WHERE email = 'ana@email.com';

Si no existe un índice útil, MySQL puede tener que revisar muchas filas.

Qué cambia al crear un índice

El índice agrega una estructura ordenada que permite al motor reducir drásticamente la cantidad de filas candidatas en ciertas búsquedas.

No modifica los datos de la tabla ni cambia el resultado de la consulta: cambia la forma en que MySQL puede llegar a ellos.

CREATE INDEX

CREATE INDEX idx_clientes_email
ON clientes(email);

PRIMARY KEY también es un índice

Las claves primarias tienen un índice asociado.

Por eso una búsqueda por id suele ser eficiente incluso si nunca creamos manualmente un índice llamado idx_id.

UNIQUE INDEX

Además de acelerar búsquedas, obliga a que los valores sean únicos.

CREATE UNIQUE INDEX uq_clientes_email
ON clientes(email);

Índices compuestos

Pueden incluir varias columnas.

CREATE INDEX idx_clientes_ciudad_apellido
ON clientes(ciudad, apellido);

Índice simple vs índice compuesto

Un índice simple tiene una sola columna. Un índice compuesto combina varias.

La combinación debería reflejar consultas reales. No conviene crear índices compuestos al azar.

El orden importa

En (ciudad, apellido), MySQL puede aprovechar el índice para ciudad o ciudad+apellido, pero no necesariamente igual para apellido solamente.

Esto se conoce como regla del prefijo izquierdo.

Por ejemplo, (cliente_id, fecha) puede ser excelente para “ventas de un cliente entre fechas”, pero no necesariamente para consultas que solo filtran por fecha.

Índices y ORDER BY

SELECT *
FROM clientes
WHERE ciudad = 'Santa Rosa'
ORDER BY apellido;

Índices y JOIN

Las columnas utilizadas para relacionar tablas suelen ser candidatas importantes para indexación.

No asumir: medir

La presencia de un índice no garantiza que MySQL vaya a usarlo. El optimizador compara alternativas y elige el plan que estima más conveniente.

Por eso debemos mirar el plan de ejecución.

EXPLAIN

EXPLAIN muestra cómo MySQL planea ejecutar una consulta.

EXPLAIN SELECT *
FROM clientes
WHERE email = 'ana@email.com';

Qué mirar en EXPLAIN

Algunos campos útiles son:

  • type: tipo de acceso;
  • possible_keys: índices candidatos;
  • key: índice elegido;
  • rows: cantidad estimada de filas a examinar.

possible_keys y key

  • possible_keys: índices que podrían utilizarse;
  • key: índice elegido.

Table scan

Un acceso tipo ALL puede indicar un recorrido completo. No siempre es malo: en tablas pequeñas puede ser razonable.

Selectividad

Un índice suele ser más útil cuando reduce mucho la cantidad de filas candidatas.

Emails, documentos o códigos únicos suelen tener alta selectividad.

Índices en columnas con pocos valores

Un índice sobre una columna booleana puede aportar poco si casi todos los registros tienen el mismo valor.

¿Por qué no indexar todo?

Cada índice debe mantenerse cuando insertamos, modificamos o eliminamos datos. Además ocupa espacio.

En una tabla con muchísimas escrituras, un exceso de índices puede empeorar el rendimiento.

Costo de los índices

Los índices aceleran lecturas, pero agregan trabajo en:

  • INSERT;
  • UPDATE;
  • DELETE;
  • almacenamiento.

SHOW INDEX

SHOW INDEX FROM clientes;

DROP INDEX

DROP INDEX idx_clientes_email ON clientes;

Índices duplicados o redundantes

Antes de crear un nuevo índice conviene revisar los existentes. Dos índices muy similares pueden aportar poco y aumentar el costo de mantenimiento.

Ejemplo práctico

CREATE INDEX idx_ventas_cliente_fecha
ON ventas(cliente_id, fecha);

Este índice puede ayudar a consultar ventas de un cliente ordenadas por fecha.

Errores comunes

  • crear índices para todas las columnas;
  • ignorar el orden en índices compuestos;
  • no usar EXPLAIN;
  • crear índices redundantes;
  • optimizar sin datos representativos.

Ejercicios

  1. crear índice sobre email;
  2. crear índice único sobre código;
  3. crear índice compuesto ciudad+apellido;
  4. comparar EXPLAIN antes y después.

¿Qué sigue?

Vistas en SQL.

¿Te sirvió esta guía? ☕

Si este contenido te ayudó y querés apoyar a Club Programador para seguir publicando ejercicios, proyectos y guías gratuitas, podés colaborar mediante:

☕ Apoyar con Mercado Pago

🌎 Apoyar con PayPal


Ruta SQL / MySQL

Ver todos los contenidos de SQL / MySQL

← Transacciones en SQL

Vistas en SQL →


Descubre más desde Club Programador

Suscríbete y recibe las últimas entradas en tu correo electrónico.

2 opiniones en “Índices en MySQL: qué son, cómo funcionan y cuándo usarlos”

Deja un comentario

Descubre más desde Club Programador

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo