Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django管理员搜索查询未命中Postgres索引_Django_Postgresql_Django Admin - Fatal编程技术网

Django管理员搜索查询未命中Postgres索引

Django管理员搜索查询未命中Postgres索引,django,postgresql,django-admin,Django,Postgresql,Django Admin,我在Postgres all localhost中使用GIN索引进行全文搜索,当我编写自己的查询并在psql中运行它时,我得到了很好的响应时间,并且解释分析报告索引命中了woohoo,但是当使用相同的搜索词通过Django Admin搜索框进行查询时,索引不会被扫描,查询需要很长时间才能完成 我的索引是通过以下方式创建的: 此查询命中索引,需要84毫秒的时间搜索900k条全文记录: SELECT COUNT(*) FROM entity WHERE name LIKE UPPER('%dub

我在Postgres all localhost中使用GIN索引进行全文搜索,当我编写自己的查询并在psql中运行它时,我得到了很好的响应时间,并且解释分析报告索引命中了woohoo,但是当使用相同的搜索词通过Django Admin搜索框进行查询时,索引不会被扫描,查询需要很长时间才能完成

我的索引是通过以下方式创建的:

此查询命中索引,需要84毫秒的时间搜索900k条全文记录:

SELECT COUNT(*) 
FROM entity 
WHERE name LIKE UPPER('%dubteeeff%') 
 AND name LIKE UPPER('%django%');
Django Admin界面创建的完全相同的查询需要938ms:

唯一的区别似乎是列的引用方式——我对Django和Postgres还比较陌生,是否有一些Postgres配置设置或Django admin QuerySet之类的设置,或者我可以覆盖或修改一个RawQuery来加速这一过程?我不希望我的管理页面在最好的情况下是缓慢的,在最坏的情况下,拖下来的网站与它的其余部分


提前感谢。

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

这可能是Postgres中计数*缓慢的问题吗?您可能希望检查修改查询以返回估计值,而不是精确的计数,这是Postgres的一个已知问题。

对于Django正在生成的不区分大小写的搜索,您需要在entityuppername而不是entityname上添加索引。

对于Django正在生成的不区分大小写的搜索,您需要在entityuppername而不是entityname上添加索引。

谢谢,但我已经完成了已经这样做了——计数*本身相当快。另外,如果这是问题所在,为什么查询会很快?啊,是的。看起来这个问题与Postgres没有以与name相同的方式解释UPPERentity.name::text有关。不知道为什么会这样,也不知道如何阻止Django这样做。祝你好运Django将在SQL中使用UPPER,如果您使用i*关键字进行不区分大小写的过滤:.filtername\uu istartswith=…,或icontainsThanks,但我已经这样做了-计数*本身相当快。另外,如果这是问题所在,为什么查询会很快?啊,是的。看起来这个问题与Postgres没有以与name相同的方式解释UPPERentity.name::text有关。不知道为什么会这样,也不知道如何阻止Django这样做。祝你好运Django将在SQL中使用UPPER,如果您使用i*关键字进行过滤,不区分大小写:.filtername__istartswith=…,或IContain。区别在于在查询中引用了列。在djange查询中,使用了一个表达式uppername,它没有索引。Araqnid是对的,您可能需要一个大写的索引,而不仅仅是名称。或者教django不要应用上限函数,或者告诉它不要使查询不区分大小写。区别在于在查询中引用了列。在djange查询中,使用了一个表达式uppername,它没有索引。Araqnid是对的,您可能需要一个大写的索引,而不仅仅是名称。或者教django不要应用上限函数,或者告诉它不要使查询不区分大小写——我不敢相信我没有注意到这一点。生成了大写索引,它就像一个符咒。谢谢-我真不敢相信我没有注意到这一点。生成了大写索引,它就像一个符咒。
SELECT COUNT(*) 
FROM entity 
WHERE name LIKE UPPER('%dubteeeff%') 
 AND name LIKE UPPER('%django%');
SELECT COUNT(*) 
FROM entity 
WHERE UPPER("entity"."name"::text) LIKE UPPER('%dubteeeff%') 
  and UPPER("entity"."name"::text) LIKE UPPER('%django%');`