Pradėkite nuo užklausos plano, tada ištaisykite didžiausią kainą. Naudokite /, kad pamatytumėte, ką iš tikrųjų daro duomenų bazė, pridėkite tinkamus , pašalinkite užklausas ir pasirinkite tik reikalingus duomenis.
Pradėkite nuo užklausos plano, tada ištaisykite didžiausią kainą. Naudokite /, kad pamatytumėte, ką iš tikrųjų daro duomenų bazė, pridėkite tinkamus , pašalinkite užklausas ir pasirinkite tik reikalingus duomenis.
EXPLAINEXPLAIN ANALYZEEXPLAIN ANALYZE parodo vykdymo planą ir tikrą laiką. Seq Scan per didelę lentelę yra klasikinis įspėjimas:
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!
Indeksas pilną nuskaitymą paverčia greitą paiešką:
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
Indeksai turi rašymo kainą: kiekvienas INSERT/UPDATE taip pat turi atnaujinti indeksą, todėl indeksuokite stulpelius, pagal kuriuos filtruojate/jungiate/rūšiuojate — ne kiekvieną stulpelį. Sudėtinis indeksas (customer_id, created_at) tarnaus WHERE customer_id = ? ORDER BY created_at vienoje struktūroje.
N+1 problema — viena užklausą sąrašui, tada viena kiekvienai eilutei — yra dažna lėtumo priežastis. Pakeiskite ją greitu įkėlimu, JOIN arba grupe 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;
Taip pat pasirinkite tik reikalingus stulpelius (išvengi SELECT *) ir pagrindinę numeraciją su LIMIT/keyset pagination, kad niekada neliestumėte milijonų eilučių.
Duomenų bazė yra dažniausias spragtukas. Plano skaitymas jums sako, kodėl užklausa yra lėta, o ne spėti; tinkamas indeksas, N+1 pašalinimas ir rezultatų rinkinio sumažinimas įprastai paverčia sekundės užklausas milisekundės — be aparatinės įrangos plėtimo.