Comienza con el plan de consulta, luego corrige el costo más alto. Usa / para ver qué hace realmente la base de datos, añade los correctos, elimina consultas , y selecciona solo los datos que necesitas.
Comienza con el plan de consulta, luego corrige el costo más alto. Usa / para ver qué hace realmente la base de datos, añade los correctos, elimina consultas , y selecciona solo los datos que necesitas.
EXPLAINEXPLAIN ANALYZEEXPLAIN ANALYZE muestra el plan de ejecución y los tiempos reales. Un Seq Scan sobre una tabla grande es la bandera roja clásica:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 42;
-- Seq Scan on orders (cost=0.00..18500 rows=120)
-- Filter: (customer_id = 42)
-- rows removed by filter: 999880 ← scanned the whole table!
Un índice convierte un escaneo completo en una búsqueda rápida:
CREATE INDEX idx_orders_customer ON orders (customer_id);
-- Now: Index Scan using idx_orders_customer (cost=0.42..8.5 rows=120)
-- 1,000,000-row scan → ~120-row lookup
Los índices tienen un costo en escrituras: cada INSERT/UPDATE también debe actualizar el índice, así que indexa las columnas en las que filtras/haces join/ordenas — no todas las columnas. Un índice compuesto (customer_id, created_at) sirve WHERE customer_id = ? ORDER BY created_at en una sola estructura.
El problema N+1 — una consulta para una lista, luego una por fila — es una causa principal de lentitud. Reemplázalo con eager loading, un JOIN, o IN (...) por lotes:
-- N+1: 1 + 100 queries
SELECT * FROM orders; -- then per order: SELECT * FROM users WHERE id = ?
-- Fixed: one JOIN, only needed columns
SELECT o.id, o.total, u.name
FROM orders o JOIN users u ON u.id = o.user_id;
También selecciona solo las columnas necesarias (evita SELECT *) y pagina con LIMIT/keyset pagination para que nunca cargues millones de filas.
La base de datos es el cuello de botella más común. Leer el plan te dice por qué una consulta es lenta en lugar de adivinar; el índice correcto, eliminar N+1, y reducir el conjunto de resultados suelen convertir consultas de varios segundos en milisegundos — sin escalar hardware.