我正在Postgres中使用GIN索引进行全文搜索(所有localhost),当我编写自己的查询并在psql中运行时,我得到了很好的响应时间,EXPLAIN ANALYZE
报告了index hit(woohoo),但是当使用相同的搜索词通过Django Admin搜索框查询时,不会扫描索引,并且查询将永远完成。
我的索引是通过fully-awesome pg_trgm Postgres extension:
创建的CREATE INDEX name_gin ON entity USING gin (name gin_trgm_ops);
此查询点击索引并采用超强 84ms 来搜索900k全文记录:
SELECT COUNT(*)
FROM entity
WHERE name LIKE UPPER('%dubteeeff%')
AND name LIKE UPPER('%django%');
由Django Admin界面创建的完全相同的查询需要 938ms :
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 - 或者我可以覆盖或修改的RawQuery加快这个速度?我不希望我的管理页面充其量是最慢的,最糟糕的是,用它拖动网站的其余部分。
提前致谢。
答案 0 :(得分:2)
对于Django正在生成的不区分大小写的搜索,您需要在entity(upper(name))
而不是entity(name)
上添加索引。
答案 1 :(得分:0)
这可能是一个问题,COUNT(*)在Postgres中速度慢吗?您可能需要检查修改查询以返回估计值而不是精确计数,因为这是Postgres的已知问题。