Start med forespørgselsplanen, og løs derefter det største problem. Brug EXPLAIN/ til at se, hvad databasen faktisk gør, tilføj de rigtige , eliminér forespørgsler, og vælg kun de data, du har brug for.
Start med forespørgselsplanen, og løs derefter det største problem. Brug EXPLAIN/ til at se, hvad databasen faktisk gør, tilføj de rigtige , eliminér forespørgsler, og vælg kun de data, du har brug for.
EXPLAIN ANALYZEEXPLAIN ANALYZE viser eksekueringsplanen og reelle tidsmålinger. En Seq Scan over en stor tabel er det klassiske advarselstegn:
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!
Et indeks gør en fuld scanning til et hurtigt opslag:
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
Indekser har en omkostning ved skrivninger: hver INSERT/UPDATE skal også opdatere indekset, så indekser de kolonner, du filtrerer/joiner/sorterer på — ikke alle kolonner. Et sammensat indeks (customer_id, created_at) betjener WHERE customer_id = ? ORDER BY created_at i en struktur.
N+1-problemet — én forespørgsel for en liste, derefter én pr. række — er en topårsag til langsom ydeevne. Erstat det med eager loading, et JOIN, eller batchede 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;
Vælg også kun nødvendige kolonner (undgå SELECT *) og paginer med LIMIT/keyset pagination, så du aldrig indlæser millioner af rækker.
Databasen er den mest almindelige flaskehals. At læse planen fortæller dig hvorfor en forespørgsel er langsom i stedet for at gætte; det rigtige indeks, fjernelse af N+1, og trimning af resultatsettet gør rutineret anden-lange forespørgsler til millisekund-lange — uden at skalere hardwaren.