我可能在标题中提出了错误的问题。这是事实:
我的客户服务人员一直抱怨在基于Django的站点的管理界面上进行客户查找时响应速度慢。
我们正在使用Postgres 8.4.6。我开始记录慢速查询,并发现了这个罪魁祸首:
SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')
此查询最多需要32秒才能运行。这是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)
因为这是由Django ORM从Django Admin应用程序生成的Django QuerySet中生成的查询,所以我对该查询本身没有任何控制权。索引似乎是合理的解决方案。我尝试创建索引来加快速度,但是并没有什么不同:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
我究竟做错了什么?如何加快查询速度?