如何在具有 60 个功能的 1000 万行数据库上加速 Django 查询聚合?
How can I speed up Django Query aggregations on a 10 million row database with 60 features?
我在 psql 中有一个数据库 table,其中包含 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 行或对其中一个字段求和一定不会花那么长时间。我做错了什么?
这个我也要说。我第一次在此 table 上尝试此代码时,一切都很好,捕获结果可能需要 1 秒,但现在 3 分钟真的很烦人。从那以后,我没有更改数据库或代码中的任何内容。
通常,如果您要根据特定字段或字段数过滤 table,则应在这些字段上创建索引。它允许数据库查询规划器在 searching/sorting.
时采用更优化的路径
从您的问题来看,您似乎正在使用 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
我在 psql 中有一个数据库 table,其中包含 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 行或对其中一个字段求和一定不会花那么长时间。我做错了什么?
这个我也要说。我第一次在此 table 上尝试此代码时,一切都很好,捕获结果可能需要 1 秒,但现在 3 分钟真的很烦人。从那以后,我没有更改数据库或代码中的任何内容。
通常,如果您要根据特定字段或字段数过滤 table,则应在这些字段上创建索引。它允许数据库查询规划器在 searching/sorting.
时采用更优化的路径从您的问题来看,您似乎正在使用 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