Ein Index ist wie ein Register in einem Buch: statt jede Seite durchzugehen, springt die Datenbank direkt an die richtige Stelle.
Indizes machen Abfragen deutlich schneller – aber kosten etwas Speicher und verlangsamen das Einfügen.
🔹 Standard-Index (B-Tree)
B-Tree ist der Standardindex in PostgreSQL.
Beispiel: Index auf der Spalte email
in kunden
:
CREATE INDEX idx_kunden_email ON kunden(email);
👉 Beschleunigt Abfragen wie:
SELECT * FROM kunden WHERE email = 'anna@example.com';
🔹 Unique Index
Ein Index kann auch Eindeutigkeit erzwingen:
CREATE UNIQUE INDEX idx_kunden_email_unique ON kunden(email);
👉 Ähnlich wie UNIQUE
im Tabellendesign, aber flexibler (kann später ergänzt werden).
🔹 Mehrspalten-Index
Ein Index kann mehrere Spalten abdecken:
CREATE INDEX idx_bestellungen_kunde_datum ON bestellungen(kunde_id, datum);
👉 Gut für Abfragen wie:
SELECT * FROM bestellungen WHERE kunde_id = 2 AND datum > '2025-01-01';
🔹 Besondere Indexarten in PostgreSQL
PostgreSQL bietet mehr als nur B-Tree:
- GIN (Generalized Inverted Index) → ideal für
JSONB
, Arrays, Volltextsuche - GiST (Generalized Search Tree) → für Geodaten (PostGIS), komplexe Suchstrukturen
- BRIN (Block Range Index) → sehr platzsparend, gut für riesige Tabellen mit sortierten Werten (z. B. Logfiles nach Zeit)
Beispiele:
JSONB-Suche mit GIN
CREATE INDEX idx_users_data ON users USING GIN (data);
Volltextsuche
CREATE INDEX idx_docs_content ON documents USING GIN (to_tsvector('german', content));
🔹 Index löschen
DROP INDEX idx_kunden_email;
🔹 Index prüfen (EXPLAIN)
Mit EXPLAIN
kannst du sehen, ob ein Index genutzt wird:
EXPLAIN SELECT * FROM kunden WHERE email = 'anna@example.com';
👉 Ausgabe zeigt, ob ein Index Scan oder ein Seq Scan (sequentiell) erfolgt.
🔹 Unterschiede zu MySQL/MariaDB
- PostgreSQL hat mehr Indexarten (GIN, GiST, BRIN).
- MySQL kennt primär B-Tree und Fulltext-Index (nur in InnoDB/MyISAM).
- PostgreSQL erlaubt funktionale Indizes → Index auf einem Ausdruck, nicht nur auf einer Spalte.
Beispiel:
CREATE INDEX idx_lower_email ON kunden((lower(email)));
👉 Beschleunigt case-insensitive Suche:
SELECT * FROM kunden WHERE lower(email) = 'anna@example.com';
🔹 Übungen
- Erstelle einen Index auf
kunden(email)
. - Prüfe mit
EXPLAIN
, ob der Index genutzt wird. - Erstelle einen zusammengesetzten Index auf
bestellungen(kunde_id, datum)
. - Bonus: Erstelle einen funktionalen Index mit
lower(email)
und teste eine Suche.
✅ Zusammenfassung
- Indizes beschleunigen Abfragen, kosten aber Speicher & Performance beim Schreiben.
- Standard ist B-Tree, PostgreSQL hat zusätzlich GIN, GiST, BRIN.
- Mehrspalten-Indizes helfen bei komplexen Abfragen.
- Funktionale Indizes sind ein starkes Postgres-Feature.
- Mit
EXPLAIN
kannst du prüfen, ob ein Index wirklich genutzt wird.
👉 Im nächsten Kapitel geht es um Erweiterungen & Spezialfunktionen – eines der Highlights von PostgreSQL.
📚 Inhaltsverzeichnis
👉 psql Kapitel 1: Installation & Anmeldung mit psql
👉 psql Kapitel 2: Benutzer & Rollen in PostgreSQL
👉 psql Kapitel 3: Datenbanken & Tabellen erstellen
👉 psql Kapitel 4: CRUD-Befehle (SELECT, INSERT, UPDATE, DELETE)
👉 psql Kapitel 5: Schlüssel & Constraints in PostgreSQL
👉 psql Kapitel 6: Indizes & Performance
👉 psql Kapitel 7: Erweiterungen & Spezialfunktionen
👉 psql Kapitel 8: Backups & Restore in PostgreSQL
⭐ Bonus-Kapitel
👉 psql Kapitel 9 (Bonus): Admin-Tipps & Best Practices für PostgreSQL