我有一个使用通用的关系非常基本的“新闻源”页,以下模型:减少数据库查询最近的一个活动
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个查询。
解决此问题的最佳方法是什么?我主要关心的不是减少查询次数,而是尽可能快地加载页面。 (我的第一个想法是反规范化)。
请注意,该页面并非每个用户都是动态的,但对所有用户都是一样的。谢谢。
感谢您的回复。你会建议改变表 - 例如没有一个字段的“credits”,而不是在视图中为它创建一个字典 – David542
很难说,我有许多领域的许多领域,并根据他们的应用程序或者不是性能问题或我的存在的祸根。一般来说,最好花一些时间来优化查询,然后重新修改数据库的性能;数据库往往足够快,如果你只是在工作。 –