i在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分钟真的很烦人。从那以后,我没有更改数据库或代码中的任何内容。
通常,如果要根据某个字段或字段数量过滤表,则应在这些字段上创建索引。它允许数据库查询计划者在搜索/排序时采用更优化的路径。
看起来您正在使用问题中的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
应该有良好的索引数据库表,正在过滤。
如果您多次使用group_by搅动,则使用CTE。支持它的django-cte包装。
如果您有历史数据并执行多个时间汇总,请使用Postgres或各自的DB替代方案中的金属化视图。您可以通过安排作业定期刷新数据。在垫子视图中,您还可以创建索引。