Django过滤器未在PostgreSQL JSONfield上使用索引 [英] Django filter is not using the index on Postgresql JSONField
本文介绍了Django过滤器未在PostgreSQL JSONfield上使用索引的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的Django模型包含PostgreSQL jsonb field
:
class SocialUser(models.Model):
id = models.BigIntegerField(primary_key=True)
data = JSONField(blank=True, null=True, db_index=True)
数据字段包含username
属性。
我已按
为此属性编制了索引CREATE INDEX ON users_socialuser ((data->>'username'));
当我使用ID通过Django ORM查询时,
SocialUser.objects.get(id=123)
并通过pgAdmin
SELECT * FROM users_socialuser WHERE id = 123
他们都很快。
但当我使用JSONfield的属性UserName进行查询时,pgAdmin SQL查询
SELECT * FROM users_socialuser WHERE data->>'username' = 'abc'
仍然一样快,而
SocialUser.objects.get(data__username='abc')
太慢了。
Django ORM似乎没有使用username
属性上的索引。
为什么会这样?我可以在Django ORM中显式强制使用索引吗?是否有解决此问题的方法?
推荐答案
在研究Django ORM生成的查询时,我注意到WHERE子句类似
data -> 'screen_name' = 'abc'
请注意,单箭头->
而不是->>
。
所以,我用单个箭头建立了一个索引
CREATE INDEX ON users_socialuser ((data->'username'));
而且ORM查询现在也很快。
这篇关于Django过滤器未在PostgreSQL JSONfield上使用索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文