Saya mungkin mengajukan pertanyaan yang salah dalam judul. Berikut ini faktanya:
Masyarakat layanan pelanggan saya mengeluh tentang waktu respons yang lambat ketika melakukan pencarian pelanggan pada antarmuka administrasi situs berbasis Django kami.
Kami menggunakan Postgres 8.4.6. Saya mulai mencatat pertanyaan yang lambat, dan menemukan penyebabnya:
SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')
Kueri ini membutuhkan waktu hingga 32 detik untuk dijalankan. Inilah paket kueri yang disediakan oleh EXPLAIN:
QUERY PLAN
Aggregate (cost=205171.71..205171.72 rows=1 width=0)
-> Seq Scan on auth_user (cost=0.00..205166.46 rows=2096 width=0)
Filter: (upper((email)::text) ~~ '%DEYK%'::text)
Karena ini adalah kueri yang dihasilkan oleh Django ORM dari Django QuerySet yang dihasilkan oleh aplikasi Admin Django, saya tidak memiliki kontrol atas kueri itu sendiri. Indeks sepertinya solusi logis. Saya mencoba membuat indeks untuk mempercepat ini, tetapi tidak ada bedanya:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
Apa yang saya lakukan salah? Bagaimana saya bisa mempercepat permintaan ini?