Beginne mit dem Query-Plan, dann behebe die größten Kosten. Nutze /, um zu sehen, was die Datenbank tatsächlich tut, füge die richtigen hinzu, eliminiere -Abfragen und wähle nur die Daten aus, die du benötigst.
Beginne mit dem Query-Plan, dann behebe die größten Kosten. Nutze /, um zu sehen, was die Datenbank tatsächlich tut, füge die richtigen hinzu, eliminiere -Abfragen und wähle nur die Daten aus, die du benötigst.
EXPLAINEXPLAIN ANALYZEEXPLAIN ANALYZE zeigt den Ausführungsplan und echte Zeitmessungen. Ein Seq Scan über eine große Tabelle ist das klassische Warnsignal:
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!
Ein Index verwandelt einen vollständigen Scan in eine schnelle Suche:
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
Indizes haben Kosten bei Schreibvorgängen: jeder INSERT/UPDATE muss auch den Index aktualisieren, daher indexiere die Spalten, nach denen du filterst/joinst/sortierst – nicht jede Spalte. Ein zusammengesetzter Index (customer_id, created_at) bedient WHERE customer_id = ? ORDER BY created_at in einer Struktur.
Das N+1-Problem – eine Abfrage für eine Liste, dann eine pro Zeile – ist eine Top-Ursache für Langsamkeit. Ersetze es durch Eager Loading, einen JOIN oder mit Batching mittels 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;
Auch wähle nur benötigte Spalten (vermeide SELECT *) und pagginiere mit LIMIT/Keyset-Pagination, damit du niemals Millionen von Zeilen lädst.
Die Datenbank ist der häufigste Engpass. Das Lesen des Plans sagt dir, warum eine Abfrage langsam ist, statt zu raten; der richtige Index, das Entfernen von N+1 und das Trimmen der Ergebnismenge verwandeln routinemäßig sekunden-lange Abfragen in Millisekunden – ohne Hardware zu skalieren.