Kezdd a lekérdezési tervvel, majd javítsd ki a legnagyobb költséget. Használd az /-t, hogy megnézd, az adatbázis valójában mit csinál, adj hozzá a helyes , szüntesd meg az lekérdezéseket, és válassz csak azokat az adatokat, amelyekre szükséged van.
Kezdd a lekérdezési tervvel, majd javítsd ki a legnagyobb költséget. Használd az /-t, hogy megnézd, az adatbázis valójában mit csinál, adj hozzá a helyes , szüntesd meg az lekérdezéseket, és válassz csak azokat az adatokat, amelyekre szükséged van.
EXPLAINEXPLAIN ANALYZEAz EXPLAIN ANALYZE megjeleníti a végrehajtási tervet és a valós időzítéseket. A nagy táblában végzett Seq Scan a klasszikus vörös zászló:
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!
Egy index teljesen végigmegy egy gyors keresésre:
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
Az indexeknek költsége van az íráskor: minden INSERT/UPDATE-nek az indexet is frissítenie kell, így indexeld azt az oszlopokat, amelyeken szűrsz/összekapcsolsz/rendezesz — nem minden oszlopot. Egy összetett index (customer_id, created_at) egy struktúrában szolgálja ki a WHERE customer_id = ? ORDER BY created_at lekérdezést.
Az N+1 probléma — egy lekérdezés egy listához, majd egy soronként — a lassúság fő oka. Cseréld le eager loading, JOIN, vagy batch IN (...) -re:
-- 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;
Emellett válassz ki csak a szükséges oszlopokat (kerüld az SELECT *-ot) és lapozz LIMIT/keyset pagination használatával, így soha nem töltesz be több millió sort.
Az adatbázis a leggyakoribb szűk keresztmetszet. A terv olvasása azt mondja meg, miért lassú egy lekérdezés, ahelyett, hogy találgatnál; a helyes index, az N+1 eltávolítása és az eredményhalmaz szűkítése rendszeresen a több másodperces lekérdezéseket milliszekundumosra változtatja — hardverskálázás nélkül.