【发布时间】:2019-07-26 14:59:52
【问题描述】:
我有一个 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 postgresql django-orm jsonb django-jsonfield