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

Indeksering ando:GIN-indekser

PostgreSQL har flere typer indekser:B-tree, Hash, GiST, Gin og SP-GiST. Det er klart, at hver af dem dækker et specifikt behov. For eksempel siger PostgreSQL-dokumentationen om GIN-indekser:

Så GIN-indekser kan bruges til at indeksere elementerne i et array, en hstore og så videre.

Men denne gang vil vi tale om et af de bidragsmoduler, der giver flere slags operatorer, der kan bruges med GIN-indekser:pg_trgm.

Dette modul opretter trigrammer af tekststrenge, så det kan bruges til at finde ligheder. Dette gør det muligt for GIN-lignende indekser, der bruger gin_trgm_ops operatorklassen, at blive brugt i LIKE-søgninger, selv når jokertegnet '%' findes i begyndelsen af ​​søgemønsteret (for eksempel:LIKE navn '%jaime%').

For at oprette et indeks, der kan bruges på denne måde, skal indekset oprettes således:

CREATE INDEX idx_gin ON table USING GIN (campo_texto gin_trgm_ops);

Med et indeks som dette har jeg set forespørgsler falde fra over 10 sekunder til et par millisekunder; Men før du skynder dig at oprette disse indekser, lad os overveje de problemer, du har.

Overvej følgende forespørgsel "select show_trgm('Jaime Casanova');" Dette viser os trigrammerne af en tekststreng, i dette tilfælde 15 trigram. Så det er ikke svært at forestille sig, at denne type indeks vokser meget, og jo større tekststrenge er, jo mere vokser indekset (fordi der kommer flere trigrammer). En anden indlysende konklusion er, at det kan være dyrt at vedligeholde denne type indekser, faktisk kan de i høj grad påvirke ydeevnen af ​​INSERT og UPDATE, især hvis der er flere af disse indekser på samme bord, for at reducere dette problem lidt, en teknik kaldet fastupdate blev opfundet, som består i at vedligeholde en uordnet liste over afventende. Så INSERT og UPDATE i stedet for at indsætte i hovedindekset, gør de det i denne ekstra struktur, indtil der opstår et VACUUM, eller indtil den ventende liste bliver større end work_mem. Ulemperne er:1) læsning af indekset skal også læse denne yderligere struktur, hvilket kan påvirke forespørgselsydelsen; og 2) en INSERT eller OPDATERING kan forårsage, at efterslæbet vokser for stort og vil derfor begynde at behandle efterslæbet, hvilket vil påvirke denne INDSÆT eller OPDATERING og alle andre operationer, der sker samtidigt på den tabel.

Afslutningsvis; et GIN-indeks sammen med pg_trgm-modulet kan i høj grad hjælpe udførelsen af ​​nogle forespørgsler, men de bør ikke misbruges, da de kan være et tveægget sværd.


  1. Returner kun række, hvis værdien ikke eksisterer

  2. MAKETIME() Eksempler – MySQL

  3. Deaktiver og aktiver senere alle tabelindekser i Oracle

  4. Sådan vender du rækkefølgen af ​​tegn i en streng i MySQL