我在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次更新全部来自不同博客时才有效。优化此查询的其他任何想法?
答案 0 :(得分:3)
尝试将广告索引添加到时间戳列:
timestamp = models.DateTimeField(db_index=True)
HTH