Django在多个相关字段上进行注释时表现不佳

时间:2017-09-10 11:27:39

标签: python django

我最近遇到了一个关于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_countcomment_count,则执行时间会下降到可接受的10毫秒。

我怀疑这是来自加入额外的表,它将总行数提升到1300 * 4300 * 6200而不是例如。 1300 * 4300

但是,我如何规避这个问题,是将数据库中的注释和帖子数量作为字段存储的最佳解决方案,并使应用程序逻辑在需要时进行更新?

0 个答案:

没有答案