🔹 Introducción
Cuando una base de datos tiene pocas filas, buscar datos es rápido.
Pero si tenemos millones de registros, una consulta puede tardar varios segundos ⏳.
👉 Para resolver esto existen los índices, que funcionan como el índice de un libro:
en vez de leer todas las páginas, vamos directamente al lugar correcto.
En SQL, los índices son estructuras que mejoran la velocidad de búsqueda, pero tienen un costo:
- Ocupan espacio extra en disco.
- Hacen más lentas las operaciones de inserción y actualización, porque el índice también debe actualizarse.
🔹 Sintaxis básica de índices
CREATE INDEX nombre_indice
ON nombre_tabla(columna);
👉 También se pueden crear índices únicos:
CREATE UNIQUE INDEX nombre_indice
ON nombre_tabla(columna);
🔹 Nuestra tabla de ejemplo
Usaremos una tabla de empleados con muchos registros:
CREATE TABLE empleados (
id INT PRIMARY KEY,
nombre VARCHAR(50),
ciudad VARCHAR(50),
salario DECIMAL(10,2)
);
INSERT INTO empleados (id, nombre, ciudad, salario) VALUES
(1, 'Ana', 'Madrid', 2500.00),
(2, 'Juan', 'Barcelona', 2200.00),
(3, 'Laura', 'Sevilla', 2700.00),
(4, 'Pedro', 'Madrid', 2000.00);
🔹 Ejemplo 1: consulta sin índice
Queremos buscar empleados que vivan en Madrid:
SELECT *
FROM empleados
WHERE ciudad = 'Madrid';
👉 Si la tabla tiene millones de filas, el motor revisará todas las filas una por una (búsqueda secuencial).
🔹 Ejemplo 2: crear un índice
Creamos un índice sobre la columna ciudad:
CREATE INDEX idx_ciudad
ON empleados(ciudad);
Ahora, la misma consulta:
SELECT *
FROM empleados
WHERE ciudad = 'Madrid';
👉 El motor usará el índice para encontrar más rápido a los empleados de Madrid.
🔹 Ejemplo 3: índice único
Supongamos que cada empleado tiene un email único:
ALTER TABLE empleados ADD COLUMN email VARCHAR(100);
CREATE UNIQUE INDEX idx_email
ON empleados(email);
👉 Si intentamos insertar dos empleados con el mismo email, dará error porque el índice UNIQUE lo impide.
🔹 Ejemplo 4: índice en varias columnas
Podemos crear un índice combinado, útil cuando consultamos por más de una columna:
CREATE INDEX idx_ciudad_salario
ON empleados(ciudad, salario);
👉 Esto acelera consultas como:
SELECT *
FROM empleados
WHERE ciudad = 'Madrid' AND salario > 2200;
🔹 Ejemplo 5: eliminar un índice
Si un índice no es necesario, podemos borrarlo:
DROP INDEX idx_ciudad ON empleados;
👉 Siempre hay que evaluar si un índice realmente aporta rendimiento.
🔹 Ejercicio práctico
- Crea un índice en la columna
ciudadde la tabla empleados. - Consulta todos los empleados que viven en «Barcelona».
- Crea un índice único en la columna
email. - Intenta insertar dos empleados con el mismo email (¿qué pasa?).
- Elimina el índice de la columna
ciudad.
🔹 Soluciones
-- 1. Índice en ciudad
CREATE INDEX idx_ciudad
ON empleados(ciudad);
-- 2. Consulta optimizada
SELECT * FROM empleados WHERE ciudad = 'Barcelona';
-- 3. Índice único en email
CREATE UNIQUE INDEX idx_email
ON empleados(email);
-- 4. Intento fallido (duplicado en email)
INSERT INTO empleados (id, nombre, ciudad, salario, email)
VALUES (5, 'Carlos', 'Valencia', 2100.00, 'ana@email.com'); -- ❌ Error
-- 5. Eliminar índice
DROP INDEX idx_ciudad ON empleados;
🔹 Mini Quiz
Resultados
#1. ¿Qué ventaja principal tienen los índices?
#2. ¿Qué desventaja tienen los índices?
#3. ¿Qué tipo de índice impide valores repetidos en una columna?
🔹 Resumen de la lección
Hoy aprendiste que los índices son estructuras que hacen más rápidas las consultas:
- CREATE INDEX → índice normal.
- CREATE UNIQUE INDEX → evita duplicados.
- Pueden aplicarse a una o varias columnas.
- Tienen costo en espacio y rendimiento al insertar/actualizar.
- Se eliminan con DROP INDEX.
👉 En la próxima lección aprenderás sobre transacciones en SQL, para asegurar que varias operaciones se ejecuten de forma confiable.
🧩 Completa tu aprendizaje explorando las demás lecciones del Curso de SQL.