Indeks satu kolom
Postgres dapat menggabungkan beberapa indeks dengan sangat efisien dalam satu kueri dengan pemindaian indeks bitmap . Sebagian besar waktu, indeks yang paling selektif dipilih (atau dua, dikombinasikan dengan pemindaian indeks bitmap) dan sisanya disaring. Setelah kumpulan hasil cukup sempit, tidak efisien untuk memindai lebih banyak indeks.
Indeks multikolom
Masih lebih cepat untuk memiliki indeks multikolom yang cocok dengan sempurna, tetapi tidak berdasarkan urutan besarnya.
Karena Anda ingin menyertakan jenis larik Saya menyarankan untuk menggunakan GIN indeks. AFAIK, kelas operator tidak ada untuk indeks GiST tujuan umum pada tipe array. (Pengecualiannya adalah intarray
untuk integer
array.)
Untuk memasukkan integer
kolom, pertama instal modul tambahan btree_gin
, yang menyediakan kelas operator GIN yang diperlukan. Jalankan sekali per database :
CREATE EXTENSION btree_gin;
Maka Anda harus dapat membuat indeks multikolom Anda:
CREATE INDEX tbl_abc_gin_idx ON tbl USING GIN(a, b, c);
Urutan kolom indeks tidak relevan untuk indeks GIN. Panduan:
Indeks GIN multikolom dapat digunakan dengan kondisi kueri yang melibatkan setiap subset kolom indeks. Tidak seperti B-tree atau GiST, efektivitas pencarian indeks adalah sama terlepas dari kolom indeks mana yang digunakan kondisi kueri.
Penelusuran tetangga terdekat
Karena Anda menyertakan geometry
PostGis ketik, kemungkinan Anda ingin melakukan pencarian tetangga terdekat, yang Anda perlukan GiST indeks. Dalam hal ini saya sarankan dua indeks:
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);
Anda dapat menambahkan integer
kolom c
ke salah satu atau keduanya. Itu tergantung. Untuk itu, Anda memerlukan btree_gin
atau btree_gist
atau keduanya, masing-masing.