2

我在 Postgres(所有本地主机)中使用 GIN 索引进行全文搜索,当我编写自己的查询并在 psql 中运行它时,我得到了很好的响应时间并EXPLAIN ANALYZE报告了索引命中(woohoo),但是当通过 Django Admin 搜索框使用相同的搜索词进行查询,不会扫描索引,并且查询需要永远完成。

因此,我的索引是通过非常棒的 pg_trgm Postgres 扩展创建的:

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 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 admin QuerySet-something,或者我可以覆盖或修改以加快速度的 RawQuery向上?我不希望我的管理页面充其量是缓慢的,最坏的情况是,将站点的其余部分拖下来。

提前致谢。

4

2 回答 2

4

看起来您需要在 Django 生成的不区分大小写的搜索上添加entity(upper(name))索引entity(name)

于 2013-01-11T19:18:49.720 回答
0

这可能是 COUNT(*) 在 Postgres 中速度慢的问题吗?您可能想要检查修改查询以返回估计值而不是精确计数,因为这是 Postgres 的一个已知问题。

于 2013-01-11T18:42:20.150 回答