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
- crear índice sobre email;
- crear índice único sobre código;
- crear índice compuesto ciudad+apellido;
- 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:
Ruta SQL / MySQL
Ver todos los contenidos de SQL / MySQL
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”