优化某个索引的jsonfield过滤值

问题描述 投票:0回答:1

场景:

qs = mymodal.objects.values('foo__0__json_key').filter(foo__0__json_key__gte=numeric_value)

我们知道“json_key”是 foo 第 0 个索引内的数值。

例如

foo = [{"json_key": 12}, {"json_key": 23} {...} ... xN ]

所以我的目标是过滤第一个 jsonfield 条目(在本例中 = 12)>= 提供的数值的每个实例,但似乎我的查询方法在例如运行此查询时的性能非常差。 10 000 个实例,其中 foo 是一个包含超过 1000 个条目的字段。

您对改善我的查询有何建议?索引?我真的需要让事情变得更快。 预先感谢。

django django-orm
1个回答
0
投票

通常,如果数据是结构化的,则将其作为 JSON blob 存储在关系数据库中没有多大意义,因为它会降低查询的表达力和效率。

如果这些是 PostgreSQL 数据库,您可以尝试为此添加索引:

from django.contrib.postgres.fields import JSONField from django.db.models import F class mymodal(models.Model): foo = JSONField() class Meta: indexes = [ models.Index(F('foo__0__json_key'), name='json_key_index'), ]
这将为值创建一个 B 树,并可能使过滤更加有效。

但无论如何,在关系数据库中,当查询、聚合等“内部”JSON Blob 对象时,JSON Blob 并不是一个真正的好概念,并且它们违反了第一范式。

© www.soinside.com 2019 - 2024. All rights reserved.