Django order_by导致查询非常慢

Ryan Pergent;

我有一个Line带有total_valuegroup字段的模型我使用以下代码来获取给定组中具有最高值的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上。

威廉·范昂塞姆(Willem Van Onsem):

您可以在数据库字段上添加索引。对于大多数数据库,这将使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章