Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在一个具有60个特性的1000万行数据库上加速Django查询聚合?_Python_Django_Django Queryset_Psql - Fatal编程技术网

Python 如何在一个具有60个特性的1000万行数据库上加速Django查询聚合?

Python 如何在一个具有60个特性的1000万行数据库上加速Django查询聚合?,python,django,django-queryset,psql,Python,Django,Django Queryset,Psql,我在psql中有一个数据库表,它包含10000000行和60列(特性)。我将Django查询集定义如下: MyQ=MyDataBase.objects.filter(Name='Mike', date=date(2018, 2, 11), Class='03') 只有5行满足上述筛选条件。但当我尝试类似的东西时 MyQ.count() #which equals 5 或 每次大约需要3分钟才能给出结果。这不是很奇怪吗?难道查询集不应该只关注我们告诉它们要关注的行,从而简化工作吗?计算5行或

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

MyQ=MyDataBase.objects.filter(Name='Mike', date=date(2018, 2, 11), 
Class='03')
只有5行满足上述筛选条件。但当我尝试类似的东西时

MyQ.count() #which equals 5

每次大约需要3分钟才能给出结果。这不是很奇怪吗?难道查询集不应该只关注我们告诉它们要关注的行,从而简化工作吗?计算5行或对其中一个字段求和不能花费那么长的时间。我做错了什么


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

通常,如果您是基于某个字段或字段数筛选表,则应在这些字段上创建索引。它允许数据库查询计划器在搜索/排序时采用更优化的路径

看起来您正在使用问题中的Postgres,因此您可以从pg_索引中运行
SELECT*,其中tablename='yourtable'以查看任何现有索引

Django可以在模型定义中为您创建这些索引。例如,您的模型
MyDatabase
可能如下所示:

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

这里有一些关于在Django模型上创建索引的详细阅读:

60列是很多,但决不是数据库不能合理处理的。您要查询的表上存在哪些索引?我想,如果查询需要3分钟,查询计划器将不得不对10000000行进行完整的表扫描。我在理解索引方面也有问题。谢谢你提出来。我如何回答这个问题:“您查询的表上存在哪些索引?”通常,如果您是基于某个字段或字段数筛选表,则应该在这些字段上创建索引。它允许数据库查询计划器在搜索/排序时采用更优化的路径。看起来您正在使用问题中的Postgres,因此您可以从pg_索引中运行
SELECT*,其中tablename='yourtable'以查看任何现有索引。Django可以在模型定义中为您创建这些索引。这里有更多关于Django的阅读:@BenSiver它成功了!!!现在速度高得惊人。奇怪的是,这么小的修改竟然能如此有效。谢谢,太棒了,很高兴它对你有用!我在这里更新了我的评论,以防其他人看到类似的问题。谢谢。我使用了:class Meta(object):Index=[models.Index(fields=['Name','date','class']),]
class MyDatabase(models.Model):
    name = models.TextField(index=True)
    date = models.DateField(index=True)
   class = models.TextField(index=True)