我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 表”步骤需要很长时间,但这是另一个主题)。
到目前为止,我已经考虑了以下内容:
- 添加“更新”
DateTimeField
并Blog
添加信号或save
覆盖以使该字段与最新BlogArticle
的同步Blog
。这对性能很有好处,但违反了DRY原则。 - 查询
BlogArticle
最近 10 次更新的模型,并使用它来查询Blog
模型。但是,这只有在最后 10 次更新都来自不同的博客时才有效。
优化此查询的任何其他想法?