Фильтр 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'));

Когда я запрашиваю его через Django ORM с идентификатором,

SocialUser.objects.get(id=123)

и через pgAdmin

SELECT * FROM users_socialuser WHERE id = 123

они оба быстрые.

Но когда я запрашиваю имя пользователя атрибута JSONField, SQL-запрос pgAdmin

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

по-прежнему одинаково быстро, в то время как

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

ужасно медленно.

Похоже, что Django ORM не использует индекс атрибута username.

Почему это так? Могу ли я явно указать индекс в Django ORM? Есть ли обходной путь для этого?


person onurmatik    schedule 26.07.2019    source источник


Ответы (1)


Изучая запрос, созданный Django ORM, я заметил, что предложение WHERE похоже на

data -> 'screen_name' = 'abc'

Обратите внимание на единственную стрелку -> вместо ->>.

Итак, я построил индекс с одной стрелкой

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

и запросы ORM теперь тоже быстрые.

person onurmatik    schedule 07.08.2019