@sql-optimizerLe démineur SQL — rewrite + indexes + EXPLAIN reasoning
Maifady est un plugin Claude Code 100% gratuit avec 30 agents IA — @sql-optimizer est l'agent qui transforme tes requêtes lentes en requêtes instantanées : il analyse l'EXPLAIN ANALYZE, identifie le goulot (seq scan, sort, N+1), propose un rewrite et les index exacts à créer. Order-of-magnitude improvements, pas du micro-tuning.
Le problème qu'il résout
Ton dashboard met 4.2 secondes à charger. Tu as tracé : c'est une requête sur une table de 4 millions de lignes. Tu pourrais demander à un DBA — mais tu n'en as pas. Tu pourrais lire 30 articles sur les indexes Postgres — mais tu n'as pas 3 heures.
@sql-optimizer regarde ton EXPLAIN, te dit exactement pourquoi c'est lent (seq scan ? sort sans index ? N+1 caché ?), et propose le CREATE INDEX précis qui passera de 4.2s à 4ms.
Comment il bosse
- Tu lui donnes la requête + le schema + l'EXPLAIN ANALYZE (si possible).
- Il identifie le goulot via 10 diagnostics : seq scan, nested loop, sort sans index, predicate mal placé, OR qui défait l'index, function sur indexed column, N+1 dressé en SQL.
- Il propose un rewrite si la requête peut être réécrite mieux.
- Il propose les indexes exacts (avec colonnes et ordre) à créer.
- Il chiffre l'impact attendu (de seq scan 4.2s → index scan 4-8ms).
- Il flag les tradeoffs (coût d'écriture d'un index, etc.).
Exemple concret
Tu tapes
›@sql-optimizer cette requête prend 4.2s : SELECT o.*, u.email FROM orders o JOIN users u ON u.id = o.user_id WHERE o.status = 'pending' AND o.created_at > NOW() - INTERVAL '7 days' ORDER BY o.created_at DESC LIMIT 50; Postgres 15. Voici schemas + EXPLAIN ANALYZE : [colle]
Tu obtiens
## Diagnosis
Seq scan sur orders (4M rows). L'index (status) seul ne suffit pas —
Postgres choisit le seq scan car le filtre composite n'est pas indexé.
## Index recommendation
CREATE INDEX idx_orders_status_created ON orders (status, created_at DESC)
WHERE status = 'pending';
(Index partiel : 50× plus petit qu'un index full)
## Expected impact
Seq scan (4.2s) → Index Scan (4-8 ms) — ~500× plus rapide
## Caveats
- Insertion = écriture additionnelle dans l'index (négligeable).
- Si 'pending' > 30% des orders, l'index partiel devient moins utile.
Pourquoi tu vas l'aimer
EXPLAIN-driven
Pas de devinette : il lit l'EXPLAIN ANALYZE et raisonne sur les vrais plans d'exécution.
10× à 500× plus rapide
Vise des gains d'order-of-magnitude, pas des micro-tweaks de 5%.
Index précis
Le bon ordre de colonnes, partiel si pertinent, DESC si pertinent. Pas "ajoute un index".
Tradeoffs honnêtes
Te dit aussi le coût d'un index (écritures plus lentes) et quand il ne vaut pas le coup.
Quand l'utiliser
✅ Idéal pour
- Requête identifiée comme lente (slow query log, APM)
- Endpoint qui prend plus de 200ms
- Job batch qui n'arrive plus à tenir sa fenêtre
- Avant un test de charge — anticiper
⚠️ Pas adapté quand
- Tu démarres un projet et veux dessiner ton schéma → @schema-designer
- Tu veux écrire la migration safe → @migration-writer
- Le problème n'est pas le SQL mais l'app (cache, allocation) → @perf-profiler
Combine avec ces agents
Questions fréquentes
Quels SGBD supporte-t-il ?
MySQL, MariaDB, PostgreSQL, SQLite. Il s'adapte aux particularités (FILTER clause Postgres uniquement, window functions MySQL 8+, etc.).
Faut-il fournir l'EXPLAIN ?
Pas obligatoire mais fortement recommandé. Sans EXPLAIN, l'agent devine. Avec EXPLAIN ANALYZE, il sait et propose des fixes précis.
Propose-t-il des indexes partiels ?
Oui sur Postgres et MariaDB. Un index partiel sur "WHERE status = pending" peut être 50× plus petit qu'un index full et beaucoup plus rapide.