【问题标题】:Django - improve performance of queryset with annotateDjango - 使用注释提高查询集的性能
【发布时间】: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


    【解决方案1】:

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

    timestamp = models.DateTimeField(db_index=True)
    

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 2012-01-28
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2019-12-30
      相关资源
      最近更新 更多