Почему не работает индекс на поле json? Django, большая база данных
У меня есть модель в django, в которой есть json-поле, содержащее пищевую ценность блюда.
from django.db import models
class Meal(models.Model):
name = models.CharField(max_length=200)
portions_count = models.IntegerField()
attributes = models.JSONField()
У меня есть миллион записей о блюдах и я хотел бы выполнить поиск на основе атрибутов (gte, lte). Пример поля atrributes:
{"cep": 21.71, "eng": 23.37, "fep": 40.91, "pep": 27.29}
Пример представления:
class MealView(View):
def get(self, request, *args, **kwargs):
meals = Meal.objects.filter(attributes__eng__gte=12, attributes__cep__gte=12)[:50]
return render(request, 'meals.html', {
'meals': meals
})
...и более сложные запросы (атрибуты, количество порций и имя вместе).
Запросы могут занимать несколько секунд, а если база данных перегружена, то и больше.
Мы пытались:
GinIndex(fields=['attributes']),
или
Index(fields=['attributes'])
Но индексы не использовались. (проверено в postgres через sql запрос, таблицу pg_stat_all_indexes и explain select)
Я знаю, что было бы определенно лучше, если бы атрибуты не были в JSON. В конечном итоге мы попытаемся изменить это, но в данный момент мы ищем решение на основе JSON.