Sama seperti Anda membaca dari jjanes di tempat lain:indeks ekspresi hanya dipertimbangkan jika ekspresi cocok dengan predikat kueri secara tepat. Perencana kueri Postgres bukanlah AI. Ini akan dengan cepat mengalahkan tujuan membuat kueri dengan cepat jika perencanaannya memakan waktu terlalu lama.
Anda dapat mengoptimalkan indeks Anda sedikit, jika itu penghiburan. left()
lebih sederhana dan lebih cepat daripada substring()
:
CREATE INDEX record_changes_log_detail_old_value_ix_btree
ON record_changes_log_detail (left(old_value,1024) text_pattern_ops);
Juga, ada ukuran baris maksimum 2704 byte untuk indeks btree, bukan "batas karakter 2172 pada B-tree" .
Yang paling penting, hanya untuk pemeriksaan kesetaraan, seperti yang disarankan pertanyaan Anda, indeks btree pada nilai hash menggunakan md5(old_value)
atau hashtext(old_value)
akan menjadi banyak lebih efisien. Jika ya, ingatlah untuk bertahan melawan tabrakan hash seperti ini:
SELECT *
FROM record_changes_log_detail
WHERE hashtext(old_value) = hashtext('Gold Kerrison Neuro')
AND old_value = 'Gold Kerrison Neuro';
Predikat pertama memberi Anda akses indeks cepat. Yang kedua mengecualikan positif palsu. Tabrakan seharusnya sangat jarang. Tapi mungkin. Dan kemungkinan itu tumbuh seiring dengan ukuran tabel.
Terkait:
- Kueri PILIH dengan DISTINCT pada struktur tabel untuk grafik sangat lambat
- Apa tipe data optimal untuk bidang MD5?
- Penelusuran teks lengkap di CouchDB
Atau indeks hash seperti yang telah Anda pertimbangkan sendiri:
- Mengapa indeks hash Postgres 11 begitu besar?
(Di sini Anda tidak perlu khawatir tentang tabrakan hash; ditangani secara internal.)