我最近遇到了一个关于Django视图的性能问题。
我使用的模型类似于这些示例模型:
class User(models.Model):
name = models.CharField(max_length=32)
class Post(models.Model):
author = models.ForeignKey('User', related_name='posts')
class Comment(models.Model):
author = models.ForeignKey('User', related_name='comments')
在我看来,我需要显示每个用户编写的帖子和评论的数量,我得到的查询集如下:
User.objects.annotate(post_count=Count('posts', distinct=True),
comment_count=Count('comments', distinct=True))
这可以按预期工作,但是最近随着数据库中行数的增加,性能变得非常差。 我差不多:
Users: 1300
Comments: 4300
Posts: 6200
查询大约需要400毫秒。
如果我从查询中删除post_count
或comment_count
,则执行时间会下降到可接受的10毫秒。
我怀疑这是来自加入额外的表,它将总行数提升到1300 * 4300 * 6200
而不是例如。 1300 * 4300
。
但是,我如何规避这个问题,是将数据库中的注释和帖子数量作为字段存储的最佳解决方案,并使应用程序逻辑在需要时进行更新?