首页 > 解决方案 > 为什么 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)进行搜索。示例属性字段:

{"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'])

但是没有使用索引。(通过 sql 查询、pg_stat_all_indexes 表检查 postgres 并解释选择)

我知道如果属性不在 JSON 中肯定会更好。最终我们会尝试改变它,但目前我们正在寻找一个 JSON 解决方案。

标签: pythonjsondjangodatabaseoptimization

解决方案


推荐阅读