2011-08-21 64 views
0

我有一个使用通用的关系非常基本的“新闻源”页,以下模型:减少数据库查询最近的一个活动

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) 

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

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

请注意,该页面并非每个用户都是动态的,但对所有用户都是一样的。谢谢。

回答

3

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

  1. 使用django-debug-toolbar找出到底哪些查询正在运行
  2. 使用select_related上正由以下外键导致查询
  3. 将{%with%}用于由模板中的多次访问生成的查询。

看着你的模型,你可能访问的是content_type,然后是内容对象。如果您完全遵循学分,您可以轻松实现这一数量的查询。

+0

感谢您的回复。你会建议改变表 - 例如没有一个字段的“credits”,而不是在视图中为它创建一个字典 – David542

+0

很难说,我有许多领域的许多领域,并根据他们的应用程序或者不是性能问题或我的存在的祸根。一般来说,最好花一些时间来优化查询,然后重新修改数据库的性能;数据库往往足够快,如果你只是在工作。 –

0

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

一旦最大限度地减少了查询次数,请尝试使用Django缓存系统并缓存导致缓慢的视图或模板片段。