python 如何在一个拥有60个特性的1000万行数据库上加速Django Query聚合?

xpcnnkqh  于 2023-03-16  发布在  Python
关注(0)|答案(2)|浏览(121)

我在psql中有一个数据库表,包含10,000,000行和60列(特性)。我定义了一个Django查询集,如下所示:

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分钟真的很烦人。从那以后,我没有修改过数据库或代码中的任何内容。

soat7uwm

soat7uwm1#

一般来说,如果要基于某个字段或字段数来筛选表,则应在这些字段上创建索引。它允许数据库查询计划器在搜索/排序时采用更优化的路径。
看起来您在问题中使用的是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

sxissh06

sxissh062#

应该有很好的 IndexedDB 表是过滤。
如果你用group_by进行多次聚集,那么使用CTE. django-cte包支持它.
如果你有历史数据并且执行多次聚合,那么在postgres或者相应的数据库中使用metalized视图。你可以通过调度作业来定期刷新数据。在mat视图中,你也可以创建索引。

相关问题