减少最近活动页面上的数据库查询

时间:2011-08-21 12:11:22

标签: sql django django-models

我有一个非常基本的“新闻Feed”页面,它使用通用关系,使用以下模型:

class RecentActivity(models.Model):
    event_type = models.IntegerField(choices=EVENT_TYPES)
    timestamp = models.DateTimeField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    credits = models.ManyToManyField('videos.VideoCredit', blank=True) 

我正在使用信号来监听创建对象的时间,并在显示之前检查以确保它在视图中存在(即,它没有被删除)。这是一个非常基本的页面,只有几十行代码来生成它。但是,它产生了大量的数据库查询!在大约20个最近活动对象的页面上,它需要大约120个查询,我估计它最多可以查询大约200个查询。

解决这个问题的最佳方法是什么?我主要关注的不是减少查询数量,而是尽可能快地加载页面。 (我的第一个想法是反规范化。)

请注意,该页面不是每用户动态的,但对所有用户都是相同的。谢谢。

2 个答案:

答案 0 :(得分:3)

很难说没有更多信息,但我采取的通常步骤是:

  1. 使用django-debug-toolbar确切了解正在运行的查询
  2. 对由以下外键引起的查询使用select_related
  3. 对模板中多次访问生成的查询使用{%with%}等。
  4. 查看您的模型,您可能正在访问content_type,然后访问内容对象。如果你完全遵循学分,你就可以轻松地达到这个数量的查询。

答案 1 :(得分:0)

绝对使用django-debug-toolbar查看正在执行的查询,并确保查询数量不会随着您显示的元素对象数量线性增长。

一旦您将查询数量减少到最佳能力,请尝试使用Django缓存系统并缓存导致速度缓慢的视图或模板片段。