Začnite s planom poizvedbe, nato popravite največji stroški. Uporabite /, da vidite, kaj baza podatkov dejansko počne, dodajte prave , odpravite poizvedbe in izberite samo podatke, ki jih potrebujete.
Začnite s planom poizvedbe, nato popravite največji stroški. Uporabite /, da vidite, kaj baza podatkov dejansko počne, dodajte prave , odpravite poizvedbe in izberite samo podatke, ki jih potrebujete.
EXPLAINEXPLAIN ANALYZEEXPLAIN ANALYZE prikaže plan izvajanja in dejanske čase. Seq Scan preko velike tabele je klasično opozorilo:
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!
Indeks pretvori polno skeniranje v hitro iskanje:
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
Indeksi imajo stroške pri pisanju: vsak INSERT/UPDATE mora posodobiti tudi indeks, zato indeksirajte stolpce, na katerih filtrirate/pridružujete/sortirate — ne vsak stolpec. Sestavljeni indeks (customer_id, created_at) služi WHERE customer_id = ? ORDER BY created_at v eni strukturi.
N+1 problem — ena poizvedba za seznam, nato ena za vsako vrstico — je pogost vzrok počasnosti. Zamenjajte ga z marljivo nalaganjem, JOIN ali paketno 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;
Tudi izberite samo potrebne stolpce (izognite se SELECT *) in paginirajte z LIMIT/keyset paginacijo, da nikoli ne naložite milijonov vrstic.
Baza podatkov je najpogostejši ozki grli. Branje plana vam pove zakaj je poizvedba počasna namesto ugibanja; pravi indeks, odstranjevanje N+1 in rezanje množice rezultatov rutinsko spremenijo poizvedbe, ki trajajo sekunde, v milisekunde — brez povečanja strojne opreme.