如何在Django中优化此order_by查询?

时间:2012-05-30 19:31:54

标签: python sql django

我有以下型号:

class Movie(models.Model):
    item = models.OneToOneField(Item, primary_key=True)

class Item(models.Model):
    ...

class Popularity(models.Model):
    item = models.OneToOneField(Item, primary_key=True)
    today = models.IntegerField(default=0, db_index=True)

我想执行以下查询:

movies = Movie.objects.order_by('-item__popularity__today') \
                      .values(...)
paginator = Paginator(movies, 12)

但是,在数据库中有大约52,000行,这需要500-700ms才能运行。有没有办法让这更快?我想做的是在数据库中获取12部最受欢迎的电影。

1 个答案:

答案 0 :(得分:1)

这不是你可以在Django中做的事情。优化这种方法的方法是在数据库中。

针对此生成的实际查询运行EXPLAIN - 实际上,Django调试工具栏可以为您执行此操作 - 并注意相关子查询和JOIN是否正在使用索引,而不是全表扫描。您可能需要在item, today上为Paginator表创建索引。