【问题标题】:Django filter is not using the index on Postgresql JSONFieldDjango 过滤器没有使用 Postgresql JSONField 上的索引
【发布时间】: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


    【解决方案1】:

    探索Django ORM生成的查询,发现WHERE子句是这样的

    data -> 'screen_name' = 'abc'
    

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

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

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

    ORM 查询现在也很快。

    【讨论】:

      猜你喜欢
      • 2019-07-16
      • 2013-07-06
      • 2016-07-23
      • 2014-07-25
      • 2018-10-02
      • 2016-10-28
      • 2016-12-24
      • 2020-03-07
      • 2020-10-08
      相关资源
      最近更新 更多