Coba indeks multikolom, tetapi dengan urutan terbalik pada kolom kedua:
CREATE INDEX index_ips_begin_end_ip_num ON ips (begin_ip_num, end_ip_num DESC);
Pengurutan sebagian besar tidak relevan untuk indeks satu kolom, karena dapat dipindai mundur hampir sama cepatnya. Tapi ini penting untuk indeks multikolom.
Dengan indeks yang saya usulkan, Postgres dapat memindai kolom pertama dan menemukan alamat, di mana sisa indeks memenuhi kondisi pertama. Kemudian dapat, untuk setiap nilai kolom pertama, mengembalikan semua baris yang memenuhi kondisi kedua, hingga yang pertama gagal. Kemudian lompat ke nilai berikutnya dari kolom pertama, dst.
Ini masih kurang efisien dan Postgres mungkin lebih cepat hanya memindai kolom indeks pertama dan memfilter yang kedua. Sangat tergantung pada distribusi data Anda.
Apa pun itu, CLUSTER
menggunakan indeks multikolom dari atas bisa membantu kinerja:
CLUSTER ips USING index_ips_begin_end_ip_num
Dengan cara ini, kandidat yang memenuhi persyaratan pertama Anda dikemas ke halaman data yang sama atau berdekatan. Dapat banyak membantu kinerja jika Anda memiliki banyak baris per nilai kolom pertama. Kalau tidak, itu hampir tidak efektif.
(Ada juga alat eksternal non-pemblokiran untuk tujuan ini:pg_repack atau pg_squeeze.)
Juga, apakah autovacuum berjalan dan dikonfigurasi dengan benar atau sudahkah Anda menjalankan ANALYZE
di atas meja? Anda memerlukan statistik terkini untuk Postgres guna memilih paket kueri yang sesuai.
Apa yang akan sangat membantu di sini adalah indeks GiST untuk int8range
kolom, tersedia sejak PostgreSQL 9.2.
Bacaan lebih lanjut:
- Mengoptimalkan kueri pada rentang stempel waktu (dua kolom)
Jika rentang IP Anda dapat dicakup dengan salah satu jenis jaringan bawaan inet
atau cidr
, pertimbangkan untuk mengganti dua bigint
your Anda kolom. Atau, lebih baik lagi, lihat modul tambahan ip4r oleh Andrew Gierth (tidak dalam distribusi standar. Strategi pengindeksan berubah sesuai dengan itu.
Kecuali itu, Anda dapat melihat jawaban terkait ini di dba.SE dengan menggunakan rezim canggih dengan indeks parsial. Hal-hal canggih, tetapi memberikan kinerja yang luar biasa:
- Dapatkah indeks spasial membantu kueri "rentang - urutkan berdasarkan - batas"