/query-optimization
Optimizar queries lentas con EXPLAIN, índices y reescritura. Activar cuando el usuario tenga una query lenta, quiera optimizar SQL, usar EXPLAIN, crear indices, resolver problemas N+1 o mejorar el rendimiento de consultas.
$ npx -y skills add 686f6c61/alfred-dev --skill query-optimization --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/query-optimization
Context preview
The summary Claude sees to decide when to auto-load this skill.
Optimizar queries lentas con EXPLAIN, índices y reescritura. Activar cuando el usuario tenga una query lenta, quiera optimizar SQL, usar EXPLAIN, crear indices, resolver problemas N+1 o mejorar el rendimiento de consultas.
SKILL.md
query-optimization.SKILL.mdname: query-optimization
description: "Optimizar queries lentas con EXPLAIN, índices y reescritura. Activar cuando el usuario tenga una query lenta, quiera optimizar SQL, usar EXPLAIN, crear indices, resolver problemas N+1 o mejorar el rendimiento de consultas."
Optimización de queries
Resumen
Este skill guía el proceso de identificar y optimizar queries lentas en bases de datos relacionales. La optimización de queries no consiste en añadir índices a ciegas, sino en entender cómo el motor de base de datos ejecuta una consulta y actuar sobre los cuellos de botella concretos.
El proceso parte de una query lenta identificada (por logs, APM o reporte del usuario), aplica herramientas de análisis como EXPLAIN y propone soluciones que se validan con benchmarks antes y después.
Proceso
1. **Identificar la query lenta.** Localizar la consulta problemática a partir de fuentes concretas:
- Slow query log del motor de base de datos (MySQL: `slow_query_log`, PostgreSQL: `log_min_duration_statement`).
- Herramientas de APM (Datadog, New Relic, Sentry Performance).
- Reporte del usuario o del equipo de desarrollo.
- Registrar el tiempo actual de ejecución como baseline para comparar después.
2. **Ejecutar EXPLAIN o EXPLAIN ANALYZE.** Obtener el plan de ejecución de la query:
- **PostgreSQL:** `EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)` para ver tiempos reales y acceso a disco.
- **MySQL:** `EXPLAIN FORMAT=JSON` o `EXPLAIN ANALYZE` (MySQL 8.0+) para detalle adicional.
- Leer el plan de ejecución de dentro hacia fuera (las operaciones más internas se ejecutan primero).
3. **Identificar los cuellos de botella.** Buscar estos patrones en el plan de ejecución:
- **Seq Scan / Full Table Scan:** la base de datos recorre toda la tabla porque no hay índice útil.
- **Nested Loop sin índice:** joins que recorren la tabla interna completa por cada fila de la externa.
- **Sort sin índice:** ordenaciones que se hacen en memoria o disco en lugar de aprovechar un índice.
- **Subconsultas correlacionadas:** subconsultas que se ejecutan una vez por cada fila de la consulta externa.
- **Estimaciones incorrectas:** filas estimadas muy diferentes de las reales, lo que indica estadísticas desactualizadas.
4. **Proponer soluciones según el cuello de botella.** Cada problema tiene soluciones específicas:
- **Full scan:** crear índice en las columnas del WHERE, o índice compuesto si filtra por varias.
- **Join sin índice:** asegurar que la columna de join tiene índice en la tabla interna.
- **Subconsulta correlacionada:** reescribir como JOIN o usar CTE (Common Table Expression).
- **Ordenación costosa:** crear índice que cubra tanto el filtro como el orden.
- **Selección de demasiadas columnas:** usar SELECT explícito en lugar de SELECT * y considerar covering indexes.
- **Estadísticas obsoletas:** ejecutar ANALYZE (PostgreSQL) o ANALYZE TABLE (MySQL).
5. **Evaluar reescrituras de la query.** A veces el problema no es el índice sino la estructura de la query:
- Sustituir IN con subconsulta por EXISTS o JOIN.
- Evitar funciones sobre columnas indexadas en el WHERE (rompe el uso del índice).
- Usar paginación con cursor en lugar de OFFSET para conjuntos grandes.
- Considerar vistas materializadas para agregaciones costosas que se consultan frecuentemente.
6. **Hacer benchmark antes y después.** Medir el impacto real del cambio:
- Ejecutar la query original y la optimizada en las mismas condiciones.
- Comparar tiempo de ejecución, filas examinadas y buffers/páginas leídas.
- Verificar que la query optimizada devuelve exactamente los mismos resultados.
- Ejecutar varias iteraciones para descartar variabilidad por caché.
7. **Documentar el cambio.** Registrar la optimización con: query original, plan de ejecución antes, cambio aplicado, plan de ejecución después y métricas de mejora. Este registro es valioso para detectar regresiones futuras.
Que NO hacer
- No añadir índices sin verificar con EXPLAIN que el motor los utiliza.
- No optimizar queries que se ejecutan pocas veces al día y tardan milisegundos; centrar el esfuerzo en las que generan carga real.
- No sacrificar la legibilidad de la query por una mejora marginal de rendimiento.
- No olvidar que cada índice añadido ralentiza las operaciones de escritura (INSERT, UPDATE, DELETE).
- No confiar en el tiempo de ejecución de una sola iteración como benchmark fiable.
Read more
name: query-optimization description: "Optimizar queries lentas con EXPLAIN, índices y reescritura. Activar cuando el usuario tenga una query lenta, quiera optimizar SQL, usar EXPLAIN, crear indices, resolver problemas N+1 o mejorar el rendimiento de consultas."
Optimización de queries
Resumen
Este skill guía el proceso de identificar y optimizar queries lentas en bases de datos relacionales. La optimización de queries no consiste en añadir índices a ciegas, sino en entender cómo el motor de base de datos ejecuta una consulta y actuar sobre los cuellos de botella concretos.
El proceso parte de una query lenta identificada (por logs, APM o reporte del usuario), aplica herramientas de análisis como EXPLAIN y propone soluciones que se validan con benchmarks antes y después.
Proceso
1. **Identificar la query lenta.** Localizar la consulta problemática a partir de fuentes concretas:
- Slow query log del motor de base de datos (MySQL: `slow_query_log`, PostgreSQL: `log_min_duration_statement`).
- Herramientas de APM (Datadog, New Relic, Sentry Performance).
- Reporte del usuario o del equipo de desarrollo.
- Registrar el tiempo actual de ejecución como baseline para comparar después.
2. **Ejecutar EXPLAIN o EXPLAIN ANALYZE.** Obtener el plan de ejecución de la query:
- **PostgreSQL:** `EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)` para ver tiempos reales y acceso a disco.
- **MySQL:** `EXPLAIN FORMAT=JSON` o `EXPLAIN ANALYZE` (MySQL 8.0+) para detalle adicional.
- Leer el plan de ejecución de dentro hacia fuera (las operaciones más internas se ejecutan primero).
3. **Identificar los cuellos de botella.** Buscar estos patrones en el plan de ejecución:
- **Seq Scan / Full Table Scan:** la base de datos recorre toda la tabla porque no hay índice útil.
- **Nested Loop sin índice:** joins que recorren la tabla interna completa por cada fila de la externa.
- **Sort sin índice:** ordenaciones que se hacen en memoria o disco en lugar de aprovechar un índice.
- **Subconsultas correlacionadas:** subconsultas que se ejecutan una vez por cada fila de la consulta externa.
- **Estimaciones incorrectas:** filas estimadas muy diferentes de las reales, lo que indica estadísticas desactualizadas.
4. **Proponer soluciones según el cuello de botella.** Cada problema tiene soluciones específicas:
- **Full scan:** crear índice en las columnas del WHERE, o índice compuesto si filtra por varias.
- **Join sin índice:** asegurar que la columna de join tiene índice en la tabla interna.
- **Subconsulta correlacionada:** reescribir como JOIN o usar CTE (Common Table Expression).
- **Ordenación costosa:** crear índice que cubra tanto el filtro como el orden.
- **Selección de demasiadas columnas:** usar SELECT explícito en lugar de SELECT * y considerar covering indexes.
- **Estadísticas obsoletas:** ejecutar ANALYZE (PostgreSQL) o ANALYZE TABLE (MySQL).
5. **Evaluar reescrituras de la query.** A veces el problema no es el índice sino la estructura de la query:
- Sustituir IN con subconsulta por EXISTS o JOIN.
- Evitar funciones sobre columnas indexadas en el WHERE (rompe el uso del índice).
- Usar paginación con cursor en lugar de OFFSET para conjuntos grandes.
- Considerar vistas materializadas para agregaciones costosas que se consultan frecuentemente.
6. **Hacer benchmark antes y después.** Medir el impacto real del cambio:
- Ejecutar la query original y la optimizada en las mismas condiciones.
- Comparar tiempo de ejecución, filas examinadas y buffers/páginas leídas.
- Verificar que la query optimizada devuelve exactamente los mismos resultados.
- Ejecutar varias iteraciones para descartar variabilidad por caché.
7. **Documentar el cambio.** Registrar la optimización con: query original, plan de ejecución antes, cambio aplicado, plan de ejecución después y métricas de mejora. Este registro es valioso para detectar regresiones futuras.
Que NO hacer
- No añadir índices sin verificar con EXPLAIN que el motor los utiliza.
- No optimizar queries que se ejecutan pocas veces al día y tardan milisegundos; centrar el esfuerzo en las que generan carga real.
- No sacrificar la legibilidad de la query por una mejora marginal de rendimiento.
- No olvidar que cada índice añadido ralentiza las operaciones de escritura (INSERT, UPDATE, DELETE).
- No confiar en el tiempo de ejecución de una sola iteración como benchmark fiable.
Plugin de Claude Code: 18 agentes especializados, 60 skills, 25 comandos, 13 hooks, memoria persistente, Memory UI local, quality gates, evidence guard, continuidad operativa y modo autopilot.
Repo: 686f6c61/alfred-dev
Other skills on alfred-dev.
- /alfred
Alias global /alfred para abrir el asistente contextual de Alfred Dev sin escribir el namespace completo. Activar solo cuando el usuario invoque explicitamente /alfred.
Open skill - /choose-stack
Usar para evaluar y elegir tecnologías con matriz de decisión ponderada. Activar cuando el usuario quiera elegir tecnología, comparar frameworks, decidir entre alternativas técnicas, construir una matriz de decisión, evaluar stack, seleccionar base de datos, elegir lenguaje o
Open skill - /design-system
Usar para diseñar la arquitectura de un sistema con diagramas y contratos. Activar cuando el usuario quiera diseñar arquitectura, definir componentes del sistema, crear un diagrama de flujo, establecer contratos entre módulos, planificar la estructura del proyecto o decidir cómo
Open skill - /evaluate-dependencies
Usar para evaluar si una dependencia merece la pena antes de añadirla. Activar cuando el usuario quiera añadir una librería, saber si merece la pena esta dependencia, evaluar un paquete antes de instalarlo, hacer npm install o pip install de algo nuevo, buscar alternativas a una
Open skill - /write-adr
Usar para documentar decisiones arquitectónicas como ADR. Activar cuando el usuario quiera documentar por qué se tomó una decisión, registrar alternativas descartadas, crear un ADR, un decision record, dejar constancia de una elección técnica o justificar una decisión de diseño
Open skill - /code-review
Usar para revisar código con foco en calidad, legibilidad y errores lógicos. También: revisar código, buscar errores, calidad del código, revisión de PR, pull request review.
Open skill

