-1

私の Django アプリでは、多数の SQL クエリを含むページの読み込みが他のページよりもかなり遅いことに気付きました。私は Web 開発の初日ではなく、主に Drupal のようなリソースを大量に消費する取引を行っていますが、ページごとに 150 から 200 の SQL クエリを持つ Drupal でさえ、0.5 から 0.7 秒でページを生成します。

反対側のDjangoは、ページあたりの平均クエリ数が多かれ少なかれ非常に悪いです。たとえば、私のページの 1 つは、次のような 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 はかなり遅いです。これに対処するには、次の 3 つの選択肢があります。

  1. それについて不平を言う。

  2. 別の Web アプリケーション フレームワークに切り替えます。

  3. アプリケーションが非常に多くのデータベース クエリを生成する理由を理解し、クエリの数を減らすために Django の ORM を効果的に使用する方法を学びます。

(1) 心理的には満足できるかもしれませんが、問題は解決しません。(2) はここスタック オーバーフローではトピック外です (ただし、ウィキペディアのWeb アプリケーション フレームワークの比較 を参照してください)。

(3)についてお手伝いできますが、それはあなたのコードをもう少し見せていただく場合に限られます。引用したクエリは、Django が への呼び出しに対して生成する典型的なクエリのように見えますget()

GameNode.objects.get(id = 1058)

1 つのページで次のようなクエリを 2 つ以上実行しないでください。多くのクエリを取得したい場合GameNodesは、1 つのクエリで取得する必要があります。

GameNode.objects.filter(<criteria>)

または、GameNodeクエリしている別のモデルの外部キーによってオブジェクトが他のオブジェクトに関連付けられている場合は、GameNodeDjango のselect_related()メソッドを使用して、関連するすべてのオブジェクトを取得できます。

ほとんどの場合、処理を高速化する方法はありますが (この証言を参照)、その方法を説明する前に詳細を知る必要があります。

于 2013-04-11T09:55:20.227 に答える