在Django中生成慢页面,每页有50多​​个sql查询

时间:2013-04-10 21:35:48

标签: django django-models django-orm

在我的Django应用程序中,我注意到具有大量SQL查询的页面加载速度比其他页面慢得多。我不是Web开发的第一天,主要是我和Drupal这样的资源问题有关,但即使Drupal每页有150 - 200个sql查询,也会在0.5到0.7秒内生成页面。

来自另一方的Django,每页的平均查询次数或多或少都表现得非常糟糕。例如,我的一个页面生成了60个这样的查询:

SELECT`gamenode_gamenode`.`id`, `gamenode_gamenode`.`title`, `gamenode_gamenode`.`short_desc`, `gamenode_gamenode`.`full_desc`, `gamenode_gamenode`.`slug`, `gamenode_gamenode`.`type`, `gamenode_gamenode`.`source_gameid`, `gamenode_gamenode`.`created`, `gamenode_gamenode`.`updated`, `gamenode_gamenode`.`status`, `gamenode_gamenode`.`promote`, `gamenode_gamenode`.`sticky`, `gamenode_gamenode`.`hit_count`, `gamenode_gamenode`.`game_rank`, `gamenode_gamenode`.`share_count`, `gamenode_gamenode`.`like_count`, `gamenode_gamenode`.`comment_count` FROM `gamenode_gamenode` WHERE `gamenode_gamenode`.`id` = 1058

并将数据作为简单字符串输出,生成页面需要1200ms!我这样做只是为了测试生成许多相当简单的查询。如果我将查询数量减少到10 - 15,页面生成时间将回到或多或少可接受的数量。

所以我有一个问题,为什么Django在页面上有很多sql查询时这么慢?我使用Rails,Symfony和Drupal进行了类似的比较,所有这些“资源猪”的表现都比Django好。我做错了什么或者有一些“秘密”的设置可以让Django的速度更快,或者,Djangonauts可能会考虑这样的时间,并且只是努力编写尽可能少的查询代码?请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

是的,Django的ORM非常慢。处理这个问题有三种选择:

  1. 抱怨它。

  2. 切换到另一个Web应用程序框架。

  3. 努力了解您的应用程序为何会生成如此多的数据库查询,并学习如何有效地使用Django的ORM以减少查询次数。

  4. (1)可能在心理上令人满意但不会解决你的问题; (2)Stack Overflow是偏离主题的(但你可能会看看维基百科的Comparison of web application frameworks)。

    我们可以帮助您(3),但前提是您向我们展示了更多代码。您引用的查询看起来像Django为get()调用生成的典型查询:

    GameNode.objects.get(id = 1058)
    

    您不应该在页面上运行多个这样的查询:如果您想获得许多GameNodes,则需要在单个查询中运行它们:

    GameNode.objects.filter(<criteria>)
    

    或者,如果GameNode个对象与您正在查询的另一个模型上的外键与某个其他对象相关,那么您可以使用Django的{{3}来获取所有相关的GameNode个对象。方法。

    几乎总有一种方法可以加快速度(select_related()),但我们需要先知道细节,然后再说明如何做。