【问题标题】:Very slow django with "large" database (< 1M rows)带有“大型”数据库(< 1M 行)的非常慢的 django
【发布时间】:2021-09-14 13:35:19
【问题描述】:

我正在尝试使用 django 构建一个应用程序。当我使用小型数据库(大约 10k 行)时,该应用程序运行良好。但是,在某些视图中,我需要计算我的类的一些数据,所以我需要调用我所有的数据库。很慢(超过30s),而且根据Django Debug Toolbar的说法,大部分时间都被CPU消耗了。

这是我尝试启动的(非常)简化的代码示例:

def test_view(request):
    queryset_articles = Articles.objects.all()
    total_count = sum([a.words_count for a in queryset_articles])
    response = 'Total words : ' + str(count)
    return HttpResponse(response)

我应该怎样做才能获得合理的等待时间?我考虑做另一个表,我会经常用这些历史统计数据更新它,然后在我的视图中直接调用它们。

谢谢,

皮埃尔

【问题讨论】:

  • "调用我所有的数据库"??通常不建议这样做,如果数据过多,它甚至可能崩溃您的服务器。您唯一想要的是某个字段的 sum 吗?如果是这样,这个问题可能会给你答案:stackoverflow.com/questions/8616343/…

标签: python django database sqlite render


【解决方案1】:

试试aggregation。由于它使用数据库查询来计数,因此它可以提供从小到明显的时间增加。

from django.db.models import Sum

total_count = Articles.objects.all().aggregate(Sum('words_count'))
print(total_count)

【讨论】:

    【解决方案2】:

    首先,您应该检查 Django 调试工具栏本身是否不是导致此等待时间的原因(其文档解释了问题并提供了一些解决方案here)。

    那么,您是否尝试使用 Aggregation ?这可以优化您的代码:

    from django.db.models import Sum
    
    Articles.objects.aggregate(Sum('words_count'))
    

    【讨论】:

    • 谢谢,在发现网站很慢后我尝试了Django Toolbar,所以这不是缓慢的原因
    【解决方案3】:

    感谢您的回答,这个视图现在快了很多! 但是,我得到了一些使用不同过滤器计算平均值的视图,如下所示:

            hours_of_weekday = [Article.objects.filter(
                date__hour=k,
                date__week_day=weekday_num,
                type__in=categories).aggregate(Avg('count'))['count__avg'] for k in range(0, 24)]
    

    这仍然很慢...除了制作一个专门用于这些值的表之外还有什么想法吗?

    【讨论】:

      猜你喜欢
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      相关资源
      最近更新 更多