我有一个Line
带有total_value
和group
字段的模型。我使用以下代码来获取给定组中具有最高值的10行:
group_lines = Line.objects.filter(group_id=group_pk, total_value__gt=0)
sorted_lines = group_lines.order_by('-total_value')[:10]
ids = lines.values_list("id", flat=True)
我的数据库很大,有10M +行。该group_lines
查询返回独自1000线。
我的问题是values_list
查询需要大约2秒钟才能执行。如果我删除订单,那几乎是即时的。
花费这么长时间订购1000个对象是否正常?如何使此查询更快?
我在使用MySQL数据库的Django 2.1.7上。
您可以在数据库字段上添加索引。对于大多数数据库,这将使用B树,这将显着提高排序:
class Line(models.Model):
# …
total_value = models.IntegerField(db_index=True)
您还可以使用组合索引:
class Line(models.Model):
# …
total_value = models.IntegerField(db_index=True)
class Meta:
indexes = [
models.Index(fields=['group', 'total_value'])
]
这将增强过滤和排序值。
更新索引的时间复杂度为〜O( log N),与过滤等类似,并且检索通常也将在〜O( log N)中进行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句