Mysql Django order_by导致查询速度非常慢
我有一个模型Mysql Django order_by导致查询速度非常慢,mysql,django,Mysql,Django,我有一个模型行,带有一个总值和一个组字段。 我使用以下代码获得给定组中具有最高值的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) 我的数据库非常大,有10多条线。group\u
行
,带有一个总值
和一个组
字段。
我使用以下代码获得给定组中具有最高值的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)
我的数据库非常大,有10多条线。group\u line
查询仅返回1000行
我的问题是执行values\u list
查询大约需要2秒钟。
如果我取消订单,它几乎是即时的
订购1000件物品需要这么长时间是正常的吗?如何使此查询更快
我在Django 2.1.7上,有一个MySQL数据库。您可以在数据库字段中添加索引。对于大多数数据库,这将使用B-树,这将显著提高排序:
class Line(models.Model):
# …
total_value = models.IntegerField(db_index=True)
类行(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'])
]
类行(models.Model):
# …
total_value=models.IntegerField(db_index=True)
类元:
索引=[
models.Index(字段=['group','total_value'])
]
这将促进过滤和值排序
更新索引的时间复杂度为~O(logn),与过滤等相当。检索通常也发生在~O(logn)中。请提供相关模型。尝试在总值上添加索引field@Willem范昂森你想看什么?这是一个包含各种整型、文本字段和外键的模型。即使不是唯一的,我也可以使用total_值作为索引吗?@RyanPergent:是的,然后它将创建一个MUL索引。这样做了,现在排序是即时的:)