Как попасть в индекс базы данных json в запросе Django?
Я создал индекс на models.JSONField
в моей базе данных postgres.
class Meta:
indexes=[
models.Index(KeyTextTransform('id', 'my_json_field'), name='my_json_id_idx')
]
я написал немного sql на pg_indexes
для проверки и он там есть
CREATE INDEX my_json_id_idx on my_model USING btree (((my_json_field ->> 'id'::text)))
Одна вещь, которую следует отметить, это то, что он использует ->>
, что означает, что он приводится к тексту, я почти уверен.
Тогда, если я попытаюсь сделать запрос следующим образом
my_query = MyModel.objects.filter(my_json_field__id=1234)
Если я анализирую с помощью my_query.explain(analyze=True)
, то он показывает последовательное сканирование. При этом мой индекс вообще НЕ попадает в индекс. Когда я смотрю на SQL запроса, я думаю, что замечаю разницу в том, что в нем используется Filter: (my_model.my_json_field -> 'id'::text) = '1234'::jsonb
.
Или если я просто посмотрю на SQL запроса, то он в основном такой:
select * from my_model where (my_json_field -> id) = 1234
Я думаю, что ->
в запросе против -->
в индексе - вот что делает расхождение.
Как правильно написать запрос, чтобы он попал в индекс, или я должен переписать индекс, чтобы он использовал ->
? Кто-нибудь знает, как переписать утверждение в indexes
так, чтобы оно создавало его с ->
?
P.S Я могу написать сырой sql, который попадает в этот индекс так
select *
from my_model
where (my_json_field->>'id') = '1234'
это попадает в индекс