Introducción a los índices SQL
Lección 10.3 · Tiempo de lectura: ~10 min · Tareas de práctica ↓
Esta lección presenta los índices SQL y su papel en el rendimiento de las consultas. Aprenderás qué es un índice, cómo ayuda a obtener los datos más rápido y por qué a veces puede ralentizar las operaciones de modificación. Veremos ejemplos básicos de creación y comprobación de índices con las tablas de Sakila. Al terminar, podrás usar los índices de forma más consciente para acelerar consultas reales.
En la lección anterior vimos cómo escribir consultas que hacen menos trabajo innecesario. El siguiente paso lógico es entender el mecanismo principal para acelerar las búsquedas: los índices.
Los índices están directamente relacionados con la forma en que el SGBD busca las filas. Sin ellos, el servidor a menudo recorre la tabla entera. Con un índice adecuado, puede llegar 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 los valores de una columna.
Una analogía sencilla es el índice de un libro. En lugar de leer todas las páginas, consultas el índice y vas directamente a la sección que te interesa.
En las bases de datos relacionales, los índices más habituales son los B-tree, que funcionan bien para:
- búsquedas exactas (
=); - rangos (
>,<,BETWEEN); - ordenación (
ORDER BY) por columnas indexadas.
Cómo influyen los índices en el rendimiento
Aceleran las lecturas (SELECT)
Cuando una condición WHERE usa una columna indexada, el SGBD puede localizar las filas sin recorrer toda la tabla.
Pueden ralentizar las escrituras (INSERT, UPDATE, DELETE)
Cada índice debe mantenerse actualizado. Cuando cambian los datos, el SGBD actualiza tanto la tabla como sus índices.
Ocupan espacio adicional
Los índices se guardan por separado y ocupan espacio en disco. Crear índices en todas las columnas 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: acelerar el filtrado por una columna
Supongamos que buscamos clientes por apellido con frecuencia:
SELECT
customer_id,
first_name,
last_name
FROM customer
WHERE last_name = 'SMITH';
Sin un índice en last_name, el SGBD puede recorrer toda la tabla customer. Después de crear el índice, el tipo de acceso suele cambiar a uno más eficiente.
Comprobación con EXPLAIN: puesto delante de la consulta, la base de datos muestra el plan de ejecución en lugar del resultado, incluido el índice que usa:
EXPLAIN
SELECT
customer_id,
first_name,
last_name
FROM customer
WHERE last_name = 'SMITH';
Resultado: en el plan de ejecución deberías ver que se usa el índice (key/possible_keys en MySQL o Index Scan en PostgreSQL).
Ejemplo 2: índice compuesto
Si las consultas filtran a menudo por dos campos a la vez, un índice compuesto es útil.
CREATE INDEX idx_payment_customer_date
ON payment (customer_id, payment_date);
Una consulta que encaja bien con 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 importa. En muchos casos, pon primero el campo por el que más se filtra.
Cuándo puede no usarse un índice
Aunque el índice exista, el optimizador puede ignorarlo. Razones habituales:
- una función sobre la columna indexada en
WHERE(YEAR(payment_date)); - una búsqueda por patrón que empieza por
%(LIKE '%abc'); - una selectividad muy baja de la columna;
- un orden de columnas poco adecuado en un índice compuesto.
Ejemplo de condición que a menudo impide usar el índice:
SELECT
payment_id,
payment_date
FROM payment
WHERE YEAR(payment_date) = 2005;
Una versión más favorable para los índices:
SELECT
payment_id,
payment_date
FROM payment
WHERE payment_date >= '2005-01-01'
AND payment_date < '2006-01-01';
Recomendaciones prácticas
- Añade índices para consultas frecuentes reales, no "por si acaso".
- Empieza por las columnas que se usan en
WHERE,JOINyORDER BY. - Después de añadir un índice, compara los planes de ejecución con
EXPLAIN. - Mantén el equilibrio: demasiados índices pueden empeorar el rendimiento de las escrituras.
Puntos clave de esta lección:
- Un índice es una estructura que acelera la búsqueda de filas.
- Los índices suelen mejorar el rendimiento de
SELECT, pero pueden ralentizarINSERT,UPDATEyDELETE. - Los índices de una columna y los compuestos resuelven patrones de filtrado distintos.
- El orden de las columnas en los índices compuestos es fundamental.
EXPLAINayuda a comprobar si el SGBD usa tu índice.
Preguntas frecuentes
¿La clave primaria crea un índice automáticamente?
Sí. En MySQL, PostgreSQL y SQL Server, las restricciones PRIMARY KEY y UNIQUE crean un índice automáticamente. Con las claves foráneas depende: MySQL (InnoDB) crea un índice en la columna de la clave foránea si no existe ninguno, mientras que PostgreSQL no lo hace y tienes que añadirlo tú.
¿Cuántos índices debe tener una tabla?
No hay un número fijo. Cada índice acelera las consultas que encajan con él, pero ralentiza INSERT, UPDATE y DELETE y ocupa espacio en disco. Indexa las columnas de los WHERE, JOIN y ORDER BY frecuentes y elimina los índices sin uso o duplicados: un índice sobre (customer_id) sobra si existe otro sobre (customer_id, payment_date).
¿Cómo ver los índices de una tabla?
En MySQL, ejecuta SHOW INDEX FROM customer;. En PostgreSQL, usa \d customer en psql o consulta la vista del sistema: SELECT indexname, indexdef FROM pg_indexes WHERE tablename = 'customer';.
Preguntas de entrevista
¿Qué es un índice SQL y para qué sirve?
Un índice es una estructura de datos adicional que acelera la búsqueda de filas por los valores de una columna. Es útil porque reduce el tiempo de lectura y la cantidad de datos que hay que recorrer.
¿Por qué un índice puede acelerar SELECT pero ralentizar INSERT?
En las lecturas, el índice ayuda a localizar las filas más rápido. En las escrituras, el SGBD tiene que actualizar tanto los datos de la tabla como las estructuras del índice, lo que añade trabajo.
¿Cómo compruebas que un índice se usa de verdad?
Ejecuta EXPLAIN sobre la consulta y analiza el plan de ejecución: el tipo de acceso, el índice elegido y el número estimado de filas.