Django过滤器未在PostgreSQL JSONfield上使用索引 [英] Django filter is not using the index on Postgresql JSONField

查看:14
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆