Django order_by导致查询非常慢

时间:2020-08-22 16:43:41

标签: mysql django

我有一个模型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上。

1 个答案:

答案 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)

相关问题