PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pengindeksan dan:Indeks GIN

PostgreSQL memiliki beberapa jenis indeks:B-tree, Hash, GiST, Gin, dan SP-GiST. Jelas masing-masing mencakup kebutuhan khusus. Misalnya, dokumentasi PostgreSQL mengatakan tentang indeks GIN:

Jadi indeks GIN dapat digunakan untuk mengindeks elemen array, hstore, dan sebagainya.

Namun kali ini kita akan membahas salah satu modul contrib yang menyediakan lebih banyak jenis operator yang dapat digunakan dengan indeks GIN:pg_trgm.

Modul ini membuat trigram string teks sehingga dapat digunakan untuk menemukan kesamaan. Ini memungkinkan indeks seperti GIN yang menggunakan kelas operator gin_trgm_ops untuk digunakan dalam pencarian LIKE bahkan ketika wildcard '%' ditemukan di awal pola pencarian (misalnya:nama LIKE '%jaime%').

Untuk membuat indeks yang dapat digunakan seperti ini, indeks harus dibuat seperti ini:

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

Dengan indeks seperti ini, saya telah melihat kueri turun dari lebih dari 10 detik menjadi beberapa milidetik; namun, sebelum Anda terburu-buru membuat indeks ini, mari pertimbangkan masalah yang Anda miliki.

Pertimbangkan kueri berikut "pilih show_trgm('Jaime Casanova');" Ini menunjukkan kepada kita trigram dari string teks, dalam hal ini 15 trigram. Jadi tidak sulit membayangkan bahwa jenis indeks ini tumbuh banyak, dan semakin besar string teks, semakin banyak indeksnya (karena akan ada lebih banyak trigram). Kesimpulan lain yang jelas adalah bahwa mempertahankan jenis indeks ini bisa mahal, sebenarnya mereka dapat sangat mempengaruhi kinerja INSERT dan UPDATE, terutama jika ada beberapa indeks ini pada tabel yang sama, untuk mengurangi masalah ini sedikit teknik yang disebut fastupdate diciptakan yang terdiri dari mempertahankan daftar tertunda yang tidak berurutan. Jadi INSERT dan UPDATE alih-alih menyisipkan ke dalam indeks utama, mereka melakukannya ke dalam struktur tambahan ini sampai terjadi VACUUM atau sampai daftar yang tertunda menjadi lebih besar dari work_mem. Kekurangannya adalah:1) membaca indeks juga harus membaca struktur tambahan ini, yang dapat mempengaruhi kinerja kueri; dan 2) INSERT atau UPDATE dapat menyebabkan backlog tumbuh terlalu besar dan oleh karena itu akan mulai memproses backlog yang akan mempengaruhi INSERT atau UPDATE tersebut dan semua operasi lain yang terjadi secara bersamaan di tabel tersebut.

Kesimpulannya; indeks GIN bersama dengan modul pg_trgm dapat sangat membantu kinerja beberapa kueri, namun tidak boleh disalahgunakan karena dapat menjadi pedang bermata dua.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hitung jam kerja antara 2 tanggal di PostgreSQL

  2. Pelatihan PostgreSQL untuk MySQLer

  3. Cara Membuat Array di PostgreSQL

  4. Psycopg2 tidak suka nama tabel yang dimulai dengan huruf kecil

  5. Kolom MySQL dengan DEFAULT NULL - pilihan gaya, atau bukan?