📘 Lección 16: Índices y optimización básica

🔹 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

  1. Crea un índice en la columna ciudad de la tabla empleados.
  2. Consulta todos los empleados que viven en «Barcelona».
  3. Crea un índice único en la columna email.
  4. Intenta insertar dos empleados con el mismo email (¿qué pasa?).
  5. 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?

Previa
Finalizar

🔹 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.

Scroll al inicio