【发布时间】:2012-12-26 09:53:12
【问题描述】:
我在 Postgres(所有本地主机)中使用 GIN 索引进行全文搜索,当我编写自己的查询并在 psql 中运行它时,我得到了很好的响应时间,EXPLAIN ANALYZE 报告索引命中(woohoo),但是当通过 Django Admin 搜索框使用相同的搜索词进行查询时,不会扫描索引,并且查询需要永远完成。
我的索引是通过fully-awesome pg_trgm Postgres extension创建的:
CREATE INDEX name_gin ON entity USING gin (name gin_trgm_ops);
此查询命中索引并花费了惊人的 84 毫秒 来搜索 90 万条全文记录:
SELECT COUNT(*)
FROM entity
WHERE name LIKE UPPER('%dubteeeff%')
AND name LIKE UPPER('%django%');
由 Django 管理界面创建的完全相同的查询需要 938 毫秒:
SELECT COUNT(*)
FROM entity
WHERE UPPER("entity"."name"::text) LIKE UPPER('%dubteeeff%')
and UPPER("entity"."name"::text) LIKE UPPER('%django%');`
唯一的区别似乎是引用列的方式——我对 Django 和 Postgres 还很陌生——是否有一些 Postgres 配置设置或 Django 管理 QuerySet-something,或者我可以覆盖或修改的 RawQuery加快速度?我不希望我的管理页面充其量是缓慢的,最坏的情况是,将网站的其余部分拖下来。
提前致谢。
【问题讨论】:
-
不同之处在于您的查询中引用了该列。在 djange Query 中使用了一个表达式
upper(name),它没有被索引。 Araqnid 是对的,您可能需要在upper(name)上而不是“只是”name上的索引。或者教 django 不应用upper函数(也许告诉它不使查询不区分大小写)
标签: django postgresql django-admin