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

  1. Erstelle einen Index auf kunden(email).
  2. Prüfe mit EXPLAIN, ob der Index genutzt wird.
  3. Erstelle einen zusammengesetzten Index auf bestellungen(kunde_id, datum).
  4. 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