-1

在我的 Django 应用程序中,我注意到具有大量 sql 查询的页面的加载速度比其他页面慢得多。我不是 web 开发的第一天,主要是我与 Drupal 这样的资源大猪打交道,但即使是每页 150 到 200 个 sql 查询的 Drupal 也会在 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

并将数据输出为一个简单的字符串,生成一个页面需要 1200 毫秒!我这样做只是为了进行测试以生成许多相当简单的查询。如果我将查询数量降低到 10 - 15,页面生成时间将恢复到或多或少可以接受的数字。

所以我有一个问题,为什么页面上有很多sql查询时,Django会这么慢?我使用 Rails、Symfony 和 Drupal 进行了类似的比较,所有这些“资源消耗者”的表现都比 Django 好得多。我是不是做错了什么,或者有一些“秘密”设置可以让 Django 中的事情变得更快,或者,也许 Djangonauts 认为这样的时间是正常的,只是努力编写产生尽可能少的查询的代码?请帮我解决这个问题。

4

1 回答 1

4

是的,Django 的 ORM 很慢。您有三种选择来处理这个问题:

  1. 投诉它。

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

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

(1) 可能在心理上令人满意,但不能解决你的问题;(2) 在 Stack Overflow 上是题外话(但您可以查看 Wikipedia's Comparison of web application frameworks)。

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

GameNode.objects.get(id = 1058)

你不应该在一个页面上运行超过几个这样的查询:如果你想得到很多GameNodes,你需要在一个查询中得到它们:

GameNode.objects.filter(<criteria>)

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

几乎总有一种方法可以加快速度(请参阅this testimonial),但我们需要先了解细节,然后才能说出如何去做。

于 2013-04-11T09:55:20.227 回答