sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres, der kombinerer flere indekser

Jeg ved ikke, om Pg kan kombinere et GiST-indeks og almindelige b-træ-indekser med en bitmap-indeksscanning, men jeg formoder ikke. Du får muligvis det bedste resultat, du kan, uden at tilføje et user_id kolonne til dit GiST-indeks (og dermed gøre det større og langsommere for andre forespørgsler, der ikke bruger user_id ).

Som et eksperiment kunne du:

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

hvilket sandsynligvis vil resultere i et stort indeks, men måske øger denne forespørgsel - hvis det virker. Vær opmærksom på, at vedligeholdelse af et sådant indeks vil sænke INSERT betydeligt og UPDATE s. Hvis du dropper den gamle ix_coords dine forespørgsler vil bruge ix_coords_and_user_id selvom de ikke filtrerer på user_id , men det vil være langsommere end ix_coords . Hvis du beholder begge, bliver INSERT og UPDATE afmatning endnu værre.

Se btree-gist

(Forældet ved redigering af spørgsmål, der ændrer spørgsmålet fuldstændigt; når det blev skrevet, havde brugeren et indeks med flere kolonner, de er nu opdelt i to separate ):

Du ser ikke ud til at filtrere eller sortere på user_id , kun create_date . Pg vil (kan ikke?) kun bruge det andet led i et indeks med flere kolonner som (user_id, create_date) , den skal også bruge det første element.

Hvis du vil indeksere create_date , opret et separat indeks for det. Hvis du bruger og har brug for (user_id, create_date) indeks og brug generelt ikke kun user_id alene, se om du kan vende kolonnerækkefølgen. Opret alternativt to uafhængige indekser, (user_id) og (create_date) . Når begge kolonner er nødvendige, kan Pg kombinere de to uafhængige indekser ved hjælp af en bitmap-indeksscanning.



  1. Sådan hentes data med nuller i veltalende

  2. Fejlkode:1062. Dubleret indtastning '1' for nøglen 'PRIMÆR'

  3. Hent og bulksaml fra sys_refcursor fra en anden procedure og indsæt i en anden tabel

  4. CHECK-begrænsningen i MySQL virker ikke