Django Admin の一部のビューの読み込みに時間がかかりすぎます。Django Admin ビューをデバッグして、何がサイクルを食いつぶしているのかを確認する最良の方法は何ですか?
4 に答える
rantanplan がコメントしたように、django デバッグ ツールバーはプロファイリングを開始する最も簡単な方法です (ページの読み込み時に実行されたすべてのクエリ、その EXPLAIN、実行にかかった時間などを表示します)。ここで、遅い django インストールのプロファイリングに関する質問を見ることもできます: 実行時間に関して django アプリケーションをプロファイリングする方法は?
その質問では、 hotshot の使用について言及しています。これは、Django の Wiki のプロファイリング djangoにも記載されています。
テーブルが非常に大きく (数百万のレコードでうまくいく)、テーブル エンジンが MySQL の InnoDB である場合、私も Django Admin の特定のモデルでこれを見てきました。Django 管理者が 1 億件以上のレコードを含むテーブルに対して再びハミングするようにするための回避策を見つけるのにしばらく時間がかかりました。根本的な問題はCOUNT(*)
、ページの読み込み時に高価なクエリが発生search_fields
し、ModelAdmin のいずれかを使用するたびに検索クエリが不十分に構築されることになりました。
私はすべての解決策をここに文書化して、いつか困っている仲間の Django-er を助けることができるようにしました: http://craiglabenz.me/2013/06/12/how-i-made-django-admin-scale/
MySQL で Django を使用する場合、MySQL には INNER JOIN の最適化に関するバグがあります。Djangoで外部キーを使用しようとするAdmin.list_display
と、MySQL では非常に遅い順序付けと INNER JOIN を使用してクエリが生成されます。
これには 2 つの解決策があります。
django-mysql-fix バックエンドを使用: https://pypi.python.org/pypi/django-mysql-fix
AdminChangeList のオーバーライド
get_query_set
- フィールドの削除select_related
と設定prefetch_related
- 詳細については、こちらの他の回答を参照してください: https://stackoverflow.com/a/23097385/1178806
多くのレコードを持つForeignKeyテーブルによって引き起こされる遅い編集フォームに関するいくつかの良い答えがあります Django管理変更フォームの読み込みが非常に遅い
リスト ビューについて: 1) list_per_page オプションを追加して、表示する結果を減らすことができます。
class EventAdmin(admin.ModelAdmin):
list_per_page = 20
2) または、select_related() を使用します。
2.1) ジャンゴ < 1.6 の場合:
class EventAdmin(admin.ModelAdmin):
def queryset(self, request):
qs = super(EventAdmin, self).queryset(request)
return qs.select_related('foreign_key_field1, foreign_key_field2, etc')
2.2) django >= 1.6 の場合:
class EventAdmin(admin.ModelAdmin):
def get_queryset(self, request):
qs = super(EventAdmin, self).queryset(request)
return qs.select_related('foreign_key_field1, foreign_key_field2, etc')
もちろん、foreign_key_field1、foreign_key_field2 などを適切なフィールド名に置き換えます。