Begin met het queryplan, repareer vervolgens de grootste cost. Gebruik / om te zien wat de database daadwerkelijk doet, voeg de juiste toe, elimineer queries, en selecteer alleen de gegevens die je nodig hebt.
Begin met het queryplan, repareer vervolgens de grootste cost. Gebruik / om te zien wat de database daadwerkelijk doet, voeg de juiste toe, elimineer queries, en selecteer alleen de gegevens die je nodig hebt.
EXPLAINEXPLAIN ANALYZERead the query plan
EXPLAIN ANALYZE toont het executieplan en echte timings. Een Seq Scan over een grote tabel is de klassieke rode vlag:
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!
Een index verandert een volledige scan in een snelle opzoeking:
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
Indexes hebben een cost op writes: elke INSERT/UPDATE moet ook de index bijwerken, dus index de kolommen waarop je filtert/joins/sorteert — niet elke kolom. Een composite index (customer_id, created_at) bedient WHERE customer_id = ? ORDER BY created_at in één structuur.
Het N+1 probleem — één query voor een lijst, daarna één per rij — is een topveroorzaker van traagheid. Vervang het met eager loading, een JOIN, of batched IN (...):
-- 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;
Selecteer ook alleen nodig kolommen (vermijd SELECT *) en pagina met LIMIT/keyset pagination zodat je nooit miljoenen rijen laadt.
De database is de meest voorkomende bottleneck. Het lezen van het plan vertelt je waarom een query traag is in plaats van gokken; de juiste index, het verwijderen van N+1, en het bijsnijden van de resultatenset veranderen routine seconden-lange queries in milliseconden — zonder hardware te schalen.