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í.