„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:
- Überprüfen Sie das Abfragemuster
- Überprüfen Sie den Ausführungsplan
- 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