Django查询速度非常慢

Django查询速度非常慢,django,database,performance,django-queryset,django-postgresql,Django,Database,Performance,Django Queryset,Django Postgresql,我对Django应用程序有问题。对模型范围的查询非常慢,经过一些调试后,我仍然不知道问题出在哪里 当我像scope=scope.objects.get(pk='Esoterik I')那样查询数据库时,需要5到10秒。数据库只有不到10个条目,主键上有一个索引,所以速度太慢了。在数据库上执行等效查询时,如SELECT*FROM scope WHERE title='Esterik I'一切正常,只需大约50毫秒 如果我查询一组结果,如scope\u list=scope.objects.filt

我对Django应用程序有问题。对模型范围的查询非常慢,经过一些调试后,我仍然不知道问题出在哪里


当我像
scope=scope.objects.get(pk='Esoterik I')
那样查询数据库时,需要5到10秒。数据库只有不到10个条目,主键上有一个索引,所以速度太慢了。在数据库上执行等效查询时,如
SELECT*FROM scope WHERE title='Esterik I'一切正常,只需大约50毫秒

如果我查询一组结果,如
scope\u list=scope.objects.filter(members=some\u user)
,然后调用print(scope\u list)或迭代列表元素,也会出现同样的问题。查询本身只需要几毫秒,但是打印或迭代元素需要5到10秒,但是集合只有两个条目

数据库后端是Postgresql。本地开发服务器和apache上也出现同样的问题

以下是模型的代码:

class Scope(models.Model):
    title = models.CharField(primary_key=True, max_length=30)

    ## the semester the scope is linked with
    assoc_semester  =   models.ForeignKey(Semester, null=True) 

    ## the grade of the scope. can be Null if the scope is not a class
    assoc_grade     =   models.ForeignKey(Grade, null=True)

    ## the timetable of the scope. can be null if the scope is not direct associated with a class
    assoc_timetable =   models.ForeignKey(Timetable, null=True)

    ## the associated subject of the scope
    assoc_subject   =   models.ForeignKey(Subject)

    ## the calendar of the scope
    assoc_calendar  =   models.ForeignKey(Calendar)

    ## the usergroup of the scope
    assoc_usergroup =   models.ForeignKey(Group)

    members = models.ManyToManyField(User)

    unread_count = None
更新

下面是python分析器的输出。似乎query.py被调用了160万次——有点太多了。

您应该先尝试隔离问题。运行manage.py shell并运行以下操作:

scope = Scope.objects.get(pk='Esoterik I')
print scope
现在,django查询在不得不执行之前是不会执行的。也就是说,如果您在第一行之后遇到了速度缓慢的问题,那么问题就出在查询的创建过程中的某个地方,这表明对象管理器存在问题。下一步将是尝试通过django执行原始SQL,并确保问题确实存在于管理器中,而不是django中的一般错误

如果第二行速度较慢,则问题在于查询的实际执行或数据的显示\打印。您可以在不打印查询的情况下强制执行查询(检查文档),以确定是哪一个查询


就我所知,但我认为解决这个问题的最佳方法是将流程分解为不同的部分,找出导致缓慢的部分,以确定数据库执行时间,最好测试Django生成的查询,因为Django生成的查询可能不是简单的
SELECT*from blah blah

要查看Django生成的查询,请执行以下操作:

_somedata = Scope.objects.filter(pk='Esoterik I') # you must use filter in here
print somedata.query.__format__('')
这将显示Django生成的完整查询。然后复制它并打开Postgresql控制台并使用Postgresql分析工具:

EXPLAIN ANALYZE <your django query here>;
EXPLAIN
将显示平均执行数据,
ANAYLZE
还将显示有关该分析的执行时间的一些额外数据


您还可以查看postgresql在这些分析结果中的查询执行期间是否使用了任何索引。

此模型是否有
\uuuuuUnicode\uuuUnicode()
方法?您可以发布它吗?是的,它有:
def\uuuuu unicode\uuuuuuuu(self):返回self.title
。它会让你更好地了解是什么让你慢下来的。你是从django shell还是从其他角度来测试它?settings.py中的
DEBUG
True还是False?您提到的两个环境都连接到同一个PostgreSQL server吗?如果是,您在数据库设置中使用的是主机名或IP地址吗?
scope=scope.objects.get(pk='Something')
scope.objects.get(pk='Something')
booth占用相同的时间。如果我使用filter()而不是get(),我在执行查询时会遇到性能问题(例如,如果我尝试使用queryset内容执行print()),因此似乎查询的构建是正确的,但在执行时,当我尝试执行原始查询时,出现了一些错误,执行时间也会很长。我尝试过了。django进行的原始查询需要26毫秒的执行时间和简单的SELECT*。。。需要15毫秒。因此,生成的sql似乎不是问题所在
EXPLAIN ANALYZE SELECT * FROMsomeapp_scope WHERE id = 'Esoterik I';