1

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

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 表”步骤需要很长时间,但这是另一个主题)。

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

  • 添加“更新”DateTimeFieldBlog添加信号或save覆盖以使该字段与最新BlogArticle的同步Blog。这对性能很有好处,但违反了DRY原则。
  • 查询BlogArticle最近 10 次更新的模型,并使用它来查询Blog模型。但是,这只有在最后 10 次更新都来自不同的博客时才有效。

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

4

1 回答 1

3

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

timestamp = models.DateTimeField(db_index=True)

高温高压

于 2012-11-10T09:11:46.710 回答