Hari ini Seven Databases dalam Seven Weeks memperkenalkan saya ke indeks per operator.
Anda bisa mengindeks string untuk pola yang cocok dengan kueri sebelumnya dengan membuat
text_pattern_ops
indeks kelas operator, asalkan nilainya diindeks dalam huruf kecil.
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Kami menggunakan
text_pattern_ops
karena judulnya adalah tipe teks. Jika Anda perlu indeks varchars, karakter, atau nama, gunakan ops terkait:varchar_pattern_ops
,bpchar_pattern_ops
, danname_pattern_ops
.
Saya menemukan contohnya sangat membingungkan. Mengapa bermanfaat untuk melakukan ini?
Jika kolom adalah tipe teks, bukankah tipe lainnya (varchar, char, name) dapat digunakan untuk teks sebelum digunakan sebagai nilai pencarian?
Bagaimana indeks itu berperilaku berbeda dari yang menggunakan operator default?
CREATE INDEX moves_title_pattern ON movies (lower(title));
sumber
Jawaban:
Dokumentasi sering memberi Anda jawaban untuk pertanyaan seperti itu. Seperti dalam kasus ini juga:
Dokumentasi selanjutnya mengatakan:
Anda dapat memeriksa lokal Anda sebagai berikut (cenderung UTF8 daripada "C"):
sumber
text_pattern_ops
tergantung pada lokasi? Sepertinya itu akan menguntungkan saya karena lokal saya adalah 'en_US.UTF-8' (bukan 'C'), jadi kueri pola tidak dapat menggunakan indeks default.LIKE
kueri menggunakan indeks b-tree polos, maka db harus menggunakanC
lokal. Atau indeks ditentukan denganCOLLATE "POSIX"
(atauCOLLATE "C"
) dan kueri menentukan pencocokanCOLLATION
. Dengan susunan lainnya, urutan indeks tidak cocok dengan aturan lokal dan oleh karena itu tidak dapat digunakan untuk pencocokan pola.