Einspaltiger Index
Postgres kann mehrere Indizes sehr effizient in einer einzigen Abfrage mit Bitmap-Index-Scans kombinieren . Meistens wird der selektivste Index ausgewählt (oder zwei, kombiniert mit Bitmap-Index-Scans) und der Rest wird gefiltert. Sobald die Ergebnismenge schmal genug ist, ist es nicht effizient, weitere Indizes zu scannen.
Mehrspaltiger Index
Es ist immer noch schneller, einen perfekt passenden mehrspaltigen Index zu haben, aber nicht um Größenordnungen.
Da Sie einen Array-Typ einschließen möchten Ich schlage vor, einen GIN zu verwenden Index. AFAIK, Operatorklassen fehlen für allgemeine GiST-Indizes auf Array-Typen. (Die Ausnahme ist intarray
für integer
Arrays.)
Zum Einschließen der integer
Spalte installieren Sie zunächst das Zusatzmodul btree_gin
, das die erforderlichen GIN-Operatorklassen bereitstellt. einmal pro Datenbank ausführen :
CREATE EXTENSION btree_gin;
Dann sollten Sie in der Lage sein, Ihren mehrspaltigen Index zu erstellen:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
Die Reihenfolge der Indexspalten ist für GIN-Indizes irrelevant. Das Handbuch:
Ein mehrspaltiger GIN-Index kann mit Abfragebedingungen verwendet werden, die eine beliebige Teilmenge der Spalten des Index umfassen. Im Gegensatz zu B-Tree oder GiST ist die Indexsucheffektivität gleich, unabhängig davon, welche Indexspalte(n) die Abfragebedingungen verwenden.
Suche nach dem nächsten Nachbarn
Da Sie eine PostGis-geometry
einschließen eingeben, möchten Sie wahrscheinlich eine Suche nach dem nächsten Nachbarn durchführen, wofür Sie ein GiST benötigen Index. In diesem Fall schlage ich zwei vor Indizes:
CREATE INDEX tbl_ac_gist_idx ON tbl USING GiST(a, c); -- geometry type
CREATE INDEX tbl_bc_gin_idx ON tbl USING GIN(b, c);
Sie könnten die integer
hinzufügen Spalte c
zu einem oder beiden. Das kommt darauf an. Dazu benötigen Sie entweder btree_gin
oder btree_gist
oder beides.