PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres kombiniert mehrere Indizes

Ich weiß nicht, ob Pg einen GiST-Index und reguläre B-Tree-Indizes mit einem Bitmap-Index-Scan kombinieren kann, aber ich vermute nicht. Möglicherweise erhalten Sie das beste Ergebnis, ohne eine user_id hinzuzufügen -Spalte in Ihren GiST-Index (und macht ihn folglich größer und langsamer für andere Abfragen, die user_id nicht verwenden ).

Als Experiment könnten Sie:

CREATE EXTENSION btree_gist;
CREATE INDEX ix_coords_and_user_id ON test USING GIST (coords, user_id);

was wahrscheinlich zu einem großen Index führt, aber diese Abfrage ankurbeln könnte - wenn es funktioniert. Beachten Sie, dass die Pflege eines solchen Index INSERT erheblich verlangsamt und UPDATE s. Wenn Sie die alten ix_coords löschen Ihre Abfragen verwenden ix_coords_and_user_id auch wenn sie nicht nach user_id filtern , aber es ist langsamer als ix_coords . Wenn Sie beide beibehalten, wird INSERT ausgeführt und UPDATE Verlangsamung noch schlimmer.

Siehe btree-gist

(Veraltet durch Bearbeitung der Frage, die die Frage vollständig ändert; beim Schreiben hatte der Benutzer einen mehrspaltigen Index, den er jetzt in zwei separate unterteilt hat ):

Sie scheinen nicht nach user_id zu filtern oder zu sortieren , nur create_date . Pg wird (kann nicht?) nicht nur den zweiten Begriff eines mehrspaltigen Index wie (user_id, create_date) verwenden , es muss auch das erste Element verwendet werden.

Wenn Sie create_date indizieren möchten , erstellen Sie einen separaten Index dafür. Wenn Sie den (user_id, create_date) verwenden und benötigen index und verwenden Sie im Allgemeinen nicht nur user_id allein, sehen Sie, ob Sie die Spaltenreihenfolge umkehren können. Erstellen Sie alternativ zwei unabhängige Indizes, (user_id) und (create_date) . Wenn beide Spalten benötigt werden, kann Pg die beiden unabhängigen Indizes mit einem Bitmap-Index-Scan kombinieren.