Kurzfassung
Indizes beschleunigen Suchen und Sortieren in der Datenbank. Schlechte oder fehlende Indizes führen zu langsamen Queries und Full Table Scans. Wann Indizes anlegen und wie Queries 2026 optimieren.
Für wen ist das
- Entwickler, die SQL und ORM-Queries schreiben (Prisma, TypeORM)
- Teams, die auf Backend-Performance achten
- Alle, die langsame Queries in Produktion analysieren
Keyword (SEO)
datenbank indizes, query optimierung, postgresql, mysql, performance, explain
Wozu Indizes?
- Schnellere Suchen –
WHERE id = ?,WHERE email = ?statt Scan der ganzen Tabelle - Schnelleres Sortieren –
ORDER BY created_atmit Index aufcreated_at - Schnellere JOINs – Index auf Join-Spalte (Fremdschlüssel)
- Full Table Scan vermeiden – bei großen Tabellen bedeutet Full Scan langsame Queries
Wann Indizes anlegen?
- Spalten in WHERE (z. B.
user_id,status,email) - Spalten in ORDER BY (z. B.
created_at DESC) - Spalten in JOIN (Fremdschlüssel)
- Spalten in UNIQUE / PRIMARY KEY (meist automatisch indexiert)
Wann nicht zu viele Indizes?
- Jeder Index verlangsamt INSERT/UPDATE/DELETE (DB muss Index aktualisieren)
- Kleine Tabellen – Full Scan ist oft schnell genug
- Selten in WHERE genutzte Spalten – Index lohnt sich oft nicht
ANALYZE / EXPLAIN – langsame Queries finden
PostgreSQL:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE user_id = 123 ORDER BY created_at DESC LIMIT 10;
Achten auf:
- Seq Scan (Full Table Scan) auf großer Tabelle – oft Grund, einen Index anzulegen
- Index Scan / Index Only Scan – Index wird genutzt, meist OK
- cost – höherer Cost = teurere Query
Prisma: in Dev log: ['query'] aktivieren und Query-Zeit messen; langsame Queries in der DB mit EXPLAIN analysieren.
Beispiel: Index auf oft gefilterte Spalte
-- Tabelle orders, oft: WHERE user_id = ? ORDER BY created_at DESC
CREATE INDEX idx_orders_user_created ON orders (user_id, created_at DESC);
Ein zusammengesetzter Index (user_id, created_at) kann sowohl Filter auf user_id als auch Sortierung nach created_at bedienen, ohne extra Sortierung.
Checkliste / Schritte
- Langsame-Query-Logging aktivieren (z. B. PostgreSQL
log_min_duration_statement) - EXPLAIN ANALYZE für langsame Queries ausführen
- Indizes auf in WHERE und ORDER BY genutzte Spalten anlegen
- Nicht jede Spalte indexieren – Balance ist wichtig
- Nach Index-Anlage Query-Zeit erneut messen
FAQ
Ist ein Index auf jeder Spalte sinnvoll?
Nein. Zu viele Indizes verlangsamen Schreibvorgänge und verbrauchen Speicher. Indizes für konkrete Queries (WHERE, ORDER BY, JOIN) anlegen.
Was ist ein zusammengesetzter Index?
Ein Index über mehrere Spalten, z. B. (user_id, created_at). Die Reihenfolge der Spalten zählt – die erste Spalte sollte die sein, nach der am häufigsten gefiltert wird.
Query nach Index immer noch langsam?
Prüfen, ob der Ausführungsplan (EXPLAIN) den Index tatsächlich nutzt. Manchmal wählt die DB Full Scan (z. B. wenn ein großer Teil der Zeilen zurückgegeben wird). Ergebnis eingrenzen (LIMIT, besseres WHERE) oder Tabellen-Partitionierung erwägen.