我有一个模型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上。
答案 0 :(得分:1)
您可以在数据库字段上添加索引。对于大多数数据库,这将使用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( 记录 N)。