场景:
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 个条目的字段。
您对改善我的查询有何建议?索引?我真的需要让事情变得更快。 预先感谢。
通常,如果数据是结构化的,则将其作为 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 并不是一个真正的好概念,并且它们违反了第一范式。