如何在具有60个功能的1000万行数据库上加快Django查询聚合速度?

时间:2019-02-14 21:39:08

标签: python django django-queryset psql

我在psql中有一个数据库表,其中包含10,000,000行和60列(功能)。我定义了Django Queryset,如下所示:

MyQ=MyDataBase.objects.filter(Name='Mike', date=date(2018, 2, 11), 
Class='03')

只有5行满足上述过滤条件。但是当我尝试类似

MyQ.count() #which equals 5

MyQ.aggregate(Sum('Score'))['Score__sum'] #which equals 61

每次大约需要3分钟才能给我结果。那不是很奇怪吗?查询集难道不应该只关注我们告诉他们要关注的行来使生活更轻松吗?计算5行或求和其中的一个字段的时间不能太长。我在做什么错了?

我也应该这样说。我第一次在该表上尝试此代码,一切都很好,可能花了1秒钟才能得到结果,但是现在3分钟真的很烦人。从那时起,我就没有更改数据库或代码中的任何内容。

1 个答案:

答案 0 :(得分:2)

通常,如果要基于某个字段或字段数量过滤表,则应在这些字段上创建索引。它使数据库查询计划器在搜索/排序时可以采用更优化的路径。

您似乎从问题中使用Postgres,因此可以在psql中运行SELECT * FROM pg_indexes WHERE tablename = 'yourtable';以查看任何现有索引。

Django可以在模型定义中为您创建这些索引。例如,您的模型MyDatabase可能看起来像这样:

class MyDatabase(models.Model):
    name = models.TextField(index=True)
    date = models.DateField(index=True)
   class = models.TextField(index=True)

以下是针对在Django模型上创建索引的更多阅读内容:gun.io/blog/learn-indexing-dammit