Başlıkta yanlış soru soruyor olabilirim. İşte gerçekler:
Müşteri hizmetleri halkım, Django tabanlı sitemizin yönetim arayüzünde müşteri aramaları yaparken yavaş yanıt sürelerinden şikayet ediyor.
Postgres 8.4.6 kullanıyoruz. Yavaş sorguları kaydetmeye başladım ve bu suçluyu keşfettim:
SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')
Bu sorgunun çalışması 32 saniyeden fazla sürüyor. EXPLAIN tarafından sağlanan sorgu planı:
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)
Bu Django Yönetici uygulaması tarafından oluşturulan bir Django QuerySet Django ORM tarafından oluşturulan bir sorgu olduğundan, sorgu kendisi üzerinde herhangi bir denetimim yok. Bir dizin mantıklı bir çözüm gibi görünüyor. Bunu hızlandırmak için bir dizin oluşturmayı denedim, ancak bir fark yaratmadı:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
Neyi yanlış yapıyorum? Bu sorguyu nasıl hızlandırabilirim?