Django - 使用注释提高queryset的性能

时间:2012-11-10 08:39:48

标签: mysql django performance django-queryset

我在Django QuerySet中调用annotate时遇到了一些性能问题。让我用一个例子来解释我的问题。假设我的模型中有一个外键关系,如下所示:

def Blog(models.Model):
   owner = models.ForeignKey(User)
   title = models.CharField()

def BlogArticle(models.Model):
   blog = models.ForeignKey(Blog)
   title = models.CharField()
   body = models.CharField()
   timestamp = models.DateTimeField()

现在,我想根据博客文章的时间戳获取最近10个更新博客的列表。我可以这样做:

latest_updates = Blog.objects.annotate(updated=Max('blogarticle__timestamp')).order_by('-updated')[:10]

这很有效,但MySQL的数据很慢(分析查询显示“复制到tmp表”步骤需要很长时间,但这是另一个主题)。

到目前为止,我已经考虑了以下内容:

  • DateTimeField添加“已更新”Blog并添加信号或save覆盖,以使该字段与BlogArticle的最新Blog保持同步}。这对性能很有帮助,但违反了DRY原则。
  • 查询BlogArticle模型中最近10次更新,并使用该模型查询Blog模型。但是,这只有在最近10次更新全部来自不同博客时才有效。

优化此查询的其他任何想法?

1 个答案:

答案 0 :(得分:3)

尝试将广告索引添加到时间戳列:

timestamp = models.DateTimeField(db_index=True)

HTH