SQL y Consultas de Datos · Bases de Datos

Optimización de consultas

Diagnosticar el coste de una consulta con su plan de ejecución y aplicar índices, reescrituras y buenas prácticas para reducir tiempos de respuesta.

Optimización de consultas

Diagrama de SQL: tablas unidas con JOIN, filtrado SELECT y agregacion GROUP BY.
SQL: consultas, joins, agregacion y optimizacion de consultas.

Mapa conceptual

Mismo resultado, menos trabajo El mismo resultado se puede obtener tardando milisegundos o minutos. La diferencia está en cuánto dato toca mirar y en cuántas pasadas. Optimizar es conseguir la misma respuesta leyendo lo mínimo necesario.

El optimizador

El motor traduce tu SQL declarativo en un plan: una secuencia concreta de operaciones (barridos, búsquedas por índice, tipos de JOIN, ordenaciones). El optimizador elige el plan estimando coste. Tu trabajo es darle opciones buenas y estadísticas frescas para que acierte.

Leer el plan de ejecución

Con EXPLAIN se ve el plan sin ejecutar y con su versión analizada, el coste real por operador. Se buscan los cuellos: barridos completos de tablas enormes, ordenaciones gigantes o JOIN que multiplican filas. Sin mirar el plan, optimizar es a ciegas.

Qué es un índice

Un índice es una estructura auxiliar, casi siempre un árbol ordenado, que permite localizar filas por una columna sin recorrer toda la tabla. Acelera búsquedas por igualdad o rango a cambio de espacio y de coste en cada escritura, porque hay que mantenerlo.

Índice que sirve y índice que no

Selectividad, la clave

Un índice solo compensa si es selectivo: si el filtro deja fuera la mayor parte de las filas. Para un predicado que devuelve la mitad de la tabla, un barrido completo puede ser más rápido que saltar por índice. La utilidad depende de cuántas filas sobreviven.

Cobertura y evitar el acceso a la tabla

Un índice que incluye todas las columnas que la consulta necesita puede responder sin tocar la tabla base: es un índice cubriente. Ese ahorro de ir a por las filas completas explica por qué SELECT asterisco mata la cobertura y ralentiza.

Reescrituras que ayudan

  1. Filtra pronto: pon las condiciones más selectivas para reducir filas lo antes posible.
  2. Proyecta solo lo necesario: enumera columnas en lugar de asterisco.
  3. Sustituye subconsultas correlacionadas por JOIN cuando el plan lo pida.
  4. Cambia DISTINCT innecesario por un GROUP BY más barato o elimínalo.
  5. Parte consultas enormes en pasos si el optimizador se pierde.

El coste de los JOIN

Cada JOIN añade filas según su cardinalidad; una unión mal elegida puede explotar el resultado antes de filtrar. Unir por claves indexadas y filtrar antes de unir reduce el trabajo. El orden de las tablas y las condiciones ON importan al plan.

Estadísticas y cardinalidad

El optimizador decide con estadísticas sobre distribución de valores. Si están obsoletas, elige planes malos. Mantener estadísticas actualizadas es tan importante como crear índices: sin información fiable, el motor adivina.

Paginación cara

Un LIMIT con OFFSET grande obliga a generar y descartar todas las filas previas. Para paginar profundo, se usa paginación por clave (busca donde id mayor que el último visto) en lugar de OFFSET, que es constante en coste.

El problema de N más uno

Desde el lado de la aplicación, lanzar una consulta por cada fila de un listado (el problema de N más uno) es devastador. Se arregla con un JOIN o una consulta agrupada que traiga todo de golpe. Optimizar no es solo el SQL suelto, es el patrón de acceso.

Cada operador caro apunta a una causa y a una intervención concreta.
Síntoma en el planCausa probableRemedio
barrido completo de tablasin índice útil para el filtroíndice sobre la columna de WHERE
ordenación costosano hay índice con el orden pedidoíndice que cubra el ORDER BY
unión que explota filasJOIN por clave no únicafiltrar antes y revisar cardinalidad

Una consulta filtra por una columna y devuelve casi toda la tabla, y sigue lenta pese a tener índice en esa columna. ¿Qué explica el poco beneficio?

Medir antes y después

Toda optimización debe contrastarse: tiempo, filas leídas, coste del plan. Cambiar a ciegas por superstición (poner índices en todo) degrada escrituras y ocupa memoria. El método es hipótesis, intervención y medición.

Cuándo desnormalizar

A veces la respuesta a una lentitud crónica es sacrificar normalización: duplicar una columna calculada o pre-agrupar en una tabla resumen para no recalcular cada vez. Es un intercambio consciente entre integridad y velocidad, típico de almacenes de datos.

Errores frecuentes

Crear un índice siempre acelera las consultas que filtran por esa columna.

Mantenimiento del rendimiento

El rendimiento no se logra una vez: los planes cambian al crecer los datos y al modificarse la distribución. Monitorizar consultas lentas, renovar estadísticas y revisar índices sin uso es una disciplina continua del ingeniero de datos.

Vocabulario de optimización

Muestra cómo se ejecutará
EXPLAIN
Estructura que acelera búsquedas
Índice
Qué tan pocas filas deja pasar un filtro
Selectividad
Responde sin tocar la tabla base
Índice cubriente
Genera y descarta filas previas al paginar
OFFSET

Ordena el protocolo para acelerar una consulta lenta:

Medir
Diagnosticar
Intervenir
Verificar

Use The Index, Luke
Guía práctica de índices y rendimiento SQL.

Una consulta con WHERE año = 2026 es lenta sobre una tabla de 50 millones de filas pese a tener índice en fecha. Explica dos posibles causas relacionadas con cómo se usa ese índice y qué revisarías en el plan.

SQLZoo
Ejercicios interactivos de SQL en línea.