我在 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 分钟真的很烦人。从那时起,我没有更改数据库或代码中的任何内容。
1 回答
米脂
TA贡献1836条经验 获得超3个赞
通常,如果您根据特定字段或字段数量过滤表,则应在这些字段上创建索引。它允许数据库查询规划器在搜索/排序时采用更优化的路径。
看起来您在问题中使用了 Postgres,因此您可以SELECT * FROM pg_indexes WHERE tablename = 'yourtable';
在 psql 中运行以查看任何现有索引。
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
添加回答
举报
0/150
提交
取消