Lesión 10.5 · Tiempo de lectura: ~10 min
Esta lección introduce los índices SQL y su papel en el rendimiento de las consultas. Aprenderás qué es un índice, cómo ayuda a recuperar datos más rápido y por qué a veces puede ralentizar las operaciones de modificación de datos. Recorreremos ejemplos básicos de creación y validación de índices utilizando las tablas de Sakila. Al final de esta lección, podrás utilizar índices de manera más deliberada para acelerar consultas prácticas.
Introducción a los Índices SQL
En la lección anterior, aprendimos a leer planes de ejecución con EXPLAIN y detectar cuellos de botella. El siguiente paso lógico es entender el mecanismo central utilizado para acelerar las búsquedas: los índices.
Los índices están directamente relacionados con la forma en que un SGBD busca filas. Sin ellos, el servidor a menudo escanea toda la tabla. Con un índice adecuado, puede saltar a los datos relevantes mucho más rápido.
Qué es un índice
Un índice SQL es una estructura de datos adicional que ayuda al SGBD a encontrar filas más rápido por valores de columna.
Una analogía simple es el índice de un libro. En lugar de leer cada página, utilizas el índice y vas directamente a la sección relevante.
En bases de datos relacionales, los índices B-tree son comúnmente utilizados y funcionan bien para:
- búsquedas exactas (
=); - rangos (
>,<,BETWEEN); - ordenamiento (
ORDER BY) en columnas indexadas.
Cómo afectan los índices al rendimiento
Aceleran las lecturas (SELECT)
Cuando una condición WHERE utiliza una columna indexada, el SGBD puede localizar filas sin escanear toda la tabla.
Pueden ralentizar las escrituras (INSERT, UPDATE, DELETE)
Cada índice debe mantenerse actualizado. Cuando los datos cambian, el SGBD actualiza tanto la tabla como sus índices relacionados.
Requieren almacenamiento adicional
Los índices se almacenan por separado y consumen espacio en disco. Crear índices en cada columna suele ser una mala estrategia.
Sintaxis básica
Crear un índice de una columna:
CREATE INDEX idx_customer_last_name
ON customer (last_name);
Eliminar un índice (la sintaxis varía según el SGBD):
DROP INDEX idx_customer_last_name ON customer;
Nota: en PostgreSQL, la forma es DROP INDEX index_name; sin el nombre de la tabla.
Ejemplo 1: Acelerando el filtrado en una columna
Supongamos que buscamos frecuentemente clientes por apellido:
SELECT
customer_id,
first_name,
last_name
FROM customer
WHERE last_name = 'SMITH';
Sin un índice en last_name, el SGBD puede realizar un escaneo completo de customer. Después de crear el índice, la búsqueda generalmente cambia a un tipo de acceso más eficiente.
Validación con EXPLAIN:
EXPLAIN
SELECT
customer_id,
first_name,
last_name
FROM customer
WHERE last_name = 'SMITH';
Resultado: en el plan de ejecución, deberías ver el uso del índice (key/possible_keys en MySQL o Index Scan en PostgreSQL).
Ejemplo 2: Índice compuesto
Si las consultas a menudo filtran por dos campos juntos, un índice compuesto es útil.
CREATE INDEX idx_payment_customer_date
ON payment (customer_id, payment_date);
Una consulta que se ajusta bien a este índice:
SELECT
payment_id,
customer_id,
amount,
payment_date
FROM payment
WHERE customer_id = 15
AND payment_date >= '2005-07-01'
ORDER BY payment_date;
Nota: el orden de las columnas en un índice compuesto es importante. En muchos casos, coloca primero el campo que se filtra con más frecuencia.
Cuándo un índice puede no ser utilizado
Incluso si existe un índice, el optimizador puede omitirlo. Razones comunes:
- una función en la columna indexada en
WHERE(YEAR(payment_date)); - búsqueda de patrones con
%inicial (LIKE '%abc'); - selectividad muy baja de la columna;
- orden de columna inadecuado en un índice compuesto.
Ejemplo de una condición que a menudo previene el uso del índice:
SELECT
payment_id,
payment_date
FROM payment
WHERE YEAR(payment_date) = 2005;
Una versión más amigable con el índice:
SELECT
payment_id,
payment_date
FROM payment
WHERE payment_date >= '2005-01-01'
AND payment_date < '2006-01-01';
Recomendaciones prácticas
- Agrega índices para consultas realmente frecuentes, no "solo por si acaso".
- Comienza con columnas utilizadas en
WHERE,JOINyORDER BY. - Después de agregar un índice, compara los planes de ejecución con
EXPLAIN. - Mantén el equilibrio: demasiados índices pueden perjudicar el rendimiento de escritura.
Conclusiones clave de esta lección:
- Un índice es una estructura que acelera la búsqueda de filas.
- Los índices generalmente mejoran el rendimiento de
SELECT, pero pueden ralentizarINSERT,UPDATEyDELETE. - Los índices de una columna y compuestos resuelven diferentes patrones de filtrado.
- El orden de las columnas en los índices compuestos es crítico.
EXPLAINayuda a verificar si el SGBD utiliza tu índice.
Preguntas de entrevista
¿Qué es un índice SQL y por qué es útil?
Un índice es una estructura de datos adicional que acelera la búsqueda de filas por valores de columna. Es útil porque reduce el tiempo de lectura y la cantidad de datos escaneados.
¿Por qué puede un índice acelerar SELECT pero ralentizar INSERT?
Para lecturas, un índice ayuda a localizar filas más rápido. Para escrituras, el SGBD debe actualizar tanto los datos de la tabla como las estructuras de índice, lo que añade trabajo.
¿Cómo verificas que un índice se está utilizando realmente?
Ejecuta EXPLAIN para la consulta e inspecciona el plan de ejecución: tipo de acceso, índice seleccionado y conteo estimado de filas.
En la próxima lección, cubriremos el manejo de errores y técnicas de depuración SQL utilizadas en el trabajo diario.