1

我有一个 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 的属性用户名查询时,pgAdmin SQL 查询

SELECT * FROM users_socialuser WHERE data->>'username' = 'abc'

仍然同样快,而

SocialUser.objects.get(data__username='abc')

非常慢。

似乎 Django ORM 没有使用username属性上的索引。

为什么呢?我可以在 Django ORM 中明确强制索引吗?有解决方法吗?

4

1 回答 1

2

探索 Django ORM 生成的查询,我注意到 WHERE 子句就像

data -> 'screen_name' = 'abc'

注意单箭头->而不是->>

所以,我用单箭头建立了一个索引

CREATE INDEX ON users_socialuser ((data->'username'));

ORM 查询现在也很快。

于 2019-08-07T22:45:56.460 回答