【发布时间】:2012-10-30 12:13:53
【问题描述】:
我在 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 次更新均来自不同博客的情况。
还有其他优化此查询的想法吗?
【问题讨论】:
标签: mysql django performance django-queryset