CodeGym /Kurse /SQL SELF /Die wichtigsten Index-Typen: B-TREE,

Die wichtigsten Index-Typen: B-TREE, HASH, GIN, GiST

SQL SELF
Level 37 , Lektion 1
Verfügbar

Also, in der Welt von PostgreSQL gibt es mehrere Index-Typen, und jeder davon wurde für eine ganz bestimmte Aufgabe gebaut. Das ist wie bei der Wahl eines Fortbewegungsmittels: Für eine Runde im Park nimmst du vielleicht das Fahrrad, aber wenn du ans andere Ende der Stadt willst, steigst du ins Auto. Genau so passen verschiedene Indizes zu unterschiedlichen Aufgaben.

In PostgreSQL gehören zu den wichtigsten Index-Typen:

  • B-TREE Indizes: Allrounder für die meisten Aufgaben.
  • HASH Indizes: Optimiert für exakte Vergleiche.
  • GIN Indizes: Perfekt für die Suche in Arrays und JSONB.
  • GiST Indizes: Werden für komplexe Datentypen wie Geodaten verwendet.

Indizes sind dazu da, die Suche nach Zeilen zu beschleunigen. Es gibt 4 verschiedene Optimierungsarten: Jeder Typ beschleunigt bestimmte Aktionen und ist für bestimmte Datentypen besser geeignet.

Du kannst Indizes nicht wirklich steuern. Alles, was du machen kannst, ist, den Index-Typ zu wählen: keinen oder einen der oben genannten. Wir schauen uns jetzt jeden davon an, damit du verstehst, wann und wie du sie einsetzt.

B-TREE Indizes

B-TREE (Abkürzung für "balanced tree") ist der am häufigsten genutzte Index-Typ und das Rückgrat von PostgreSQL. Dieser Index baut eine Baumstruktur auf, in der die Daten so organisiert sind, dass Suche, Sortierung und Filterung schneller gehen.

Stell dir eine Bibliothek mit Regalen vor, auf denen die Bücher alphabetisch sortiert sind. Wenn du ein Buch mit dem Buchstaben "M" suchst, musst du nicht alle Bücher durchgehen — du fängst einfach in der Mitte an. Nach ähnlichen Prinzipien funktionieren balancierte Bäume.

Wann solltest du sie verwenden?

Eigentlich fast immer! B-TREE Indizes sind besonders nützlich für:

  • Bereichssuche: WHERE price > 100.
  • Sortierung: ORDER BY name ASC.
  • Suche nach Gleichheit: WHERE id = 42.

Hier ein Beispiel, wie man einen erstellt:

-- Erstelle einen B-TREE Index für die Spalte price in der Tabelle products:
CREATE INDEX idx_price ON products(price);

Wenn du dann im Query sowas wie WHERE price > 100 schreibst, kann PostgreSQL diesen Index nutzen und muss nicht die ganze Tabelle durchsuchen.

HASH Indizes

HASH Indizes nutzen Hash-Tabellen für ultraschnelle Suche. Ihre Stärke ist der exakte Vergleich von Werten. Aber HASH Indizes haben eine Einschränkung: Sie unterstützen keine Bereichssuche oder Sortierung.

Das ist wie eine Kartei, bei der jede Karte eine eindeutige Nummer hat. Du suchst Karte Nummer 42, und der Bibliothekar findet sie sofort. Aber wenn du sagst: „Zeig mir alle Karten von 40 bis 50“, bekommst du ein Nein.

HASH Indizes sind nur für exakte Suchen geeignet:

  • WHERE email = 'user@example.com'.
  • SELECT ... WHERE id = 123.

Wenn du Bereiche oder Sortierung brauchst, ist HASH nicht das Richtige.

Beispiel für die Erstellung:

-- Erstelle einen Hash-Index für die Spalte email in der Tabelle users:
CREATE INDEX idx_email_hash ON users USING HASH (email);

Jetzt kann PostgreSQL diesen Index für Queries wie WHERE email = 'user@example.com' verwenden.

Achtung: HASH Indizes sind für spezielle Fälle gedacht und werden seltener verwendet als B-TREE.

GIN Indizes (Generalized Inverted Index)

GIN ist ein spezialisierter Index, der echte Magie mit Arrays, JSONB und Textdaten macht. Stell dir vor, du hast einen Schrank mit tausend Schubladen, und jede Schublade ist beschriftet. Zum Beispiel liegen in der Schublade "Äpfel" alle Äpfel, in "Bananen" alle Bananen. Um Äpfel oder Bananen zu finden, musst du nicht alle Schubladen durchsuchen — du gehst direkt zur richtigen.

GIN Indizes brauchst du für:

  • Suche in Arrays: @> (enthält), <@ (ist enthalten in).
  • JSONB Daten: WHERE jsonb_data @> '{"schlüssel": "wert"}'.

Beispiel für die Erstellung

-- Erstelle einen GIN-Index für die Spalte tags, die Arrays enthält:
CREATE INDEX idx_tags_gin ON products USING GIN (tags);

Jetzt kann PostgreSQL Produkte effizient finden, bei denen die Tags zum Beispiel "elektronik" und "empfohlen" sind.

GiST Indizes (Generalized Search Tree)

GiST Indizes sind ein mächtiges Werkzeug für komplexere Datentypen, wie geografische Koordinaten und Bereiche. Sie bauen Bäume, die für räumliche Suche und Bereichssuche optimiert sind.

Stell dir eine Stadtkarte vor, auf der jeder Punkt anhand seiner Koordinaten markiert ist. Du kannst schnell alle Punkte im Umkreis von 5 km von deinem Standort finden.

GiST ist geeignet für:

  • Geodaten: SELECT ... FROM locations WHERE ST_DWithin(geom, point, distance).
  • Bereichssuche: WHERE date_range && '[2023-01-01, 2023-12-31]'.

Beispiel:

-- Erstelle einen GiST-Index für die Spalte location mit Geodaten:
CREATE INDEX idx_location_gist ON places USING GiST (location);

Jetzt kannst du komplexe Geo-Queries machen, wie zum Beispiel die Suche nach den nächsten Punkten.

Vergleichstabelle der Indizes

Index-Typ Geeignet für... Beispiele Hinweise
B-TREE Bereichssuche, Sortierung price > 100, ORDER BY name ASC Allround-Index.
HASH Exakte Gleichheitsprüfung email = 'user@example.com', id = 42 Unterstützt keine Bereiche.
GIN Arrays, JSONB tags @> '{tech}', jsonb_data @> '{"schlüssel": "wert"}' Schneller bei komplexen Daten.
GiST Geodaten, Bereiche, Distanzen ST_DWithin(geom, point, distance) Wird für Geodaten verwendet.

Jetzt kennst du die wichtigsten Index-Typen in PostgreSQL und weißt, wie du sie einsetzt. Denk dran: Die Wahl des Index ist ein strategischer Move, der die Geschwindigkeit deiner Queries bestimmt. Schachmatt, Performance-Bremsen!

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION