Tôi có thể hỏi câu hỏi sai trong tiêu đề. Dưới đây là sự thật:
Dân gian dịch vụ khách hàng của tôi đã phàn nàn về thời gian phản hồi chậm khi thực hiện tra cứu khách hàng trên giao diện quản trị của trang web dựa trên Django của chúng tôi.
Chúng tôi đang sử dụng Postgres 8.4.6. Tôi bắt đầu đăng nhập các truy vấn chậm và phát hiện ra thủ phạm này:
SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')
Truy vấn này mất tới 32 giây để chạy. Đây là kế hoạch truy vấn được cung cấp bởi 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)
Vì đây là truy vấn được tạo bởi Django ORM từ Django Queryset được tạo bởi ứng dụng Django Admin, tôi không có bất kỳ quyền kiểm soát nào đối với chính truy vấn đó. Một chỉ số có vẻ như là giải pháp hợp lý. Tôi đã thử tạo một chỉ mục để tăng tốc độ này, nhưng nó không tạo ra sự khác biệt:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
Tôi đang làm gì sai? Làm thế nào tôi có thể tăng tốc truy vấn này?