almessadi.
Zur Übersicht

Postgres-Indextypen helfen nur, wenn sie dem Abfragemuster entsprechen_

B-Baum ist der Standard aus gutem Grund, aber PostgreSQL hat andere Indextypen für Gleichheitsabfragen, Dokumentensuche, Geometrie und andere spezialisierte Zugriffsarten.

Veröffentlicht22. September 2024
Lesezeit6 min read

„Ein Index sollte hinzugefügt werden“ ist kein schlechter Ratschlag. Es ist unvollständiger Rat.

Die eigentliche Frage ist: Welche Art von Abfrage optimieren Sie?

PostgreSQL unterstützt mehrere Indextypen, da nicht alle Abfrageformen gleich aussehen. Eine gute Indexwahl folgt dem Zugriffsverhalten, anstatt blind auf das einfachste zurückzugreifen, was über die GUI generiert werden kann.

Beginnen Sie mit der Abfrage

Fragen Sie, was die Abfrage tatsächlich tut:

  • Gleichheitsabfrage
  • Bereichsscan
  • Volltextsuche
  • Geometrische Nähe
  • Dokumentenzugehörigkeit

Diese Frage sollte vor dem Indextyp gestellt werden.

B-Baum ist der Standard, nicht die universelle Antwort

B-Baum ist vielseitig und normalerweise geeignet für:

  • Gleichheit
  • Sortierung
  • Bereiche

Deshalb ist er der Standard.

Aber andere Fälle erfordern andere Werkzeuge. Zum Beispiel wird GiST relevant für geometrische Suchanfragen und Nachbarn in nächster Nähe, während GIN oft viel besser zu Dokumenten- und Volltextmustern passt.

Dieser Unterschied wird sehr schnell konkret:

CREATE INDEX articles_search_idx
  ON articles
  USING GIN (to_tsvector('english', title || ' ' || body));

Das löst ein anderes Problem als ein einfacher B-Baum auf created_at.

Gewohnheiten im Engineering, die skalieren

Merken Sie sich nicht zuerst exotische Indextypen. Merken Sie sich den Workflow:

  1. Überprüfen Sie das Abfragemuster
  2. Überprüfen Sie den Ausführungsplan
  3. Wählen Sie den Indextyp, der zur tatsächlichen Arbeit passt

Damit bleibt das Indizieren an Beweisen und nicht an Folklore gebunden.

Weiterführende Literatur