python - 为什么 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 解决方案。
解决方案
推荐阅读
- cgal - 使用 CGAL 内置数字类型
- django - 博客:如何创建一个博客,在其中可以加载我想要的任何 JS/CSS 文件并将其格式化为我想要的任何布局?
- postgresql - 使用 pbbackrest 进行异常大的增量备份
- javascript - 如何从插件更改 Grid.js 状态?
- r - 在ggplot中绘制3D环形
- javascript - Microsoft Teams 自定义选项卡应用程序 - 地理位置问题
- c# - 从 namedpipeServerStream 读取时如何处理超时?
- java - 当我长按我的应用程序时如何添加活动?
- arrays - 将 numpy 数组附加到包含现有 numpy 数组的 csv 文件
- firebase - 为什么在用于 Firebase 电话号码身份验证的 OTP SMS 末尾有一个 ID