Ibda bil-pjan tal-query, imbagħad issaħħaħ l-akbar cost. Uża EXPLAIN/ biex tara x'attwalment tagħmel il-database, żid l- tajba, neħħi l-queries , u agħżel biss id-data li għandek bżonn.
Ibda bil-pjan tal-query, imbagħad issaħħaħ l-akbar cost. Uża EXPLAIN/ biex tara x'attwalment tagħmel il-database, żid l- tajba, neħħi l-queries , u agħżel biss id-data li għandek bżonn.
EXPLAIN ANALYZEEXPLAIN ANALYZE turi l-pjan tal-eżekuzzjoni u t-timings reali. A Seq Scan fuq tabella kbira hija l-bandiera ħamra klassika:
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!
Index ibiddel scan kompltu għal lookup mabgħuta:
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 għandhom cost fuq writes: kull INSERT/UPDATE irid ukoll iġedded l-index, għalhekk index il-kolonni li tibdel/tgħaqqad/issorta — mhux kull kolonna. Index komposit (customer_id, created_at) isservi WHERE customer_id = ? ORDER BY created_at fi struttura waħda.
Il-problema N+1 — query waħda għal lista, imbagħad waħda għal kull ringiela — hija kawża ewlenija ta' tardija. Ibdel biex eager loading, JOIN, jew 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;
Għalkemm agħżel biss kolonni meħtieġa (ivita SELECT *) u paginati b'LIMIT/keyset pagination sabiex qatt ma taqleb miljuni ringieli.
Id-database hija l-bottleneck l-aktar komuni. Aqra l-pjan jgħidek għaliex query hija tard minflok taħbi; l-index tajjeb, neħħi N+1, u mozz ir-result set rutinarjament jibdlu queries tat-sekondi għal milliseconds — mingħajr scaling tal-hardware.