Know-How
SQL Optimalizace
Pomalý SQL dotaz může zabít celou aplikaci. EXPLAIN ANALYZE je váš nejlepší přítel pro optimalizaci.
EXPLAIN ANALYZE
EXPLAIN ANALYZE SELECT u.name, COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.created_at > '2024-01-01'
GROUP BY u.name
ORDER BY order_count DESC
LIMIT 10;
-- Seq Scan = špatně (full table scan)
-- Index Scan = dobře
-- Bitmap Index Scan = OK pro větší výsledky
Indexy
-- B-tree (default) — equality, range
CREATE INDEX idx_users_email ON users(email);
-- Composite index — pořadí sloupců matters!
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at DESC);
-- Partial index — jen subset dat
CREATE INDEX idx_active_users ON users(email) WHERE active = true;
-- GIN index — JSONB, full-text
CREATE INDEX idx_data ON products USING GIN(metadata);
Anti-patterns
- SELECT * (načítá zbytečné sloupce)
- N+1 problém (viz separátní článek)
- LIKE '%term%' (nemůže použít index)
- Funkce na indexovaném sloupci WHERE YEAR(created_at) = 2024
- Chybějící LIMIT na velkých tabulkách
Klíčový takeaway
EXPLAIN ANALYZE vždy. Správné indexy, žádný SELECT *, composite indexy ve správném pořadí.