2

データベースのパフォーマンスに関していくつか質問があります。私のアプリには、次の Django モデルとそれに対応する管理クラスがあります。データベースは MySQL で、Amazon RDS でホストされています。

  1. for ループを介して Notifications テーブルに約45000 レコードを追加するのに20 分以上かかりました。この時間は遅いですか、それとも正常ですか?
  2. このテーブルの django 管理インターフェースは遅すぎます。dB 負荷なしでロードするには約 30 秒かかります。また、データベースが何らかのジョブを実行している場合、ロードには通常 2 分以上かかります。通常、このテーブルには 1 週間または 2 週間ごとに 100 万件のレコードが追加されます。データベースやシステムのパフォーマンスを改善する方法はありますか、それとも現在のロード時間は正常ですか?

モデル

class Notification(models.Model):
    id = models.AutoField(primary_key=True)
    token = models.ForeignKey(Token, blank=False, null=False)
    alert = models.ForeignKey(Alert, blank=False, null=False)
    created_at = models.DateTimeField(auto_now=True)
    is_sent = models.BooleanField(default=False)
    is_processed = models.BooleanField(default=False)
    error_sending = models.BooleanField(default=False)
    # ...
    def __unicode__(self):
        return u'%s' % (self.alert )

管理者

class AppNotification(admin.ModelAdmin):
    fields = ['token','alert','is_sent','is_processed','error_sending']

    #
    list_display = ('token','alert','created_at','is_sent','is_processed','error_sending')

    #
    search_fields = ('app__app_name','token__token')

    #
    list_select_related = True

    #
    list_per_page = 25

admin.site.register(Notification,AppNotification)
4

3 に答える 3

4

for ループを介して Notifications テーブルに約 45000 レコードを追加するのに 20 分以上かかりました。この時間は遅いですか、それとも正常ですか?

この設定では珍しいことではありません。Django ORM は高速ではなく、速度が重要な場合に何千ものエントリを追加するのに適した方法ではありません。RDS の速度はインスタンスの種類によって異なりますが、一般的にローエンドのものも高速ではありません。

代わりに、低レベルの SQL を使用するか、 を使用しbulk_createますが、これらのメソッドはどちらもオブジェクトを呼び出したり.save()、送信pre_saveしたりpost_save信号を送信したりしないことに注意する必要があります。これらが多くのビジネスロジックを含む場合、それは問題になる可能性があります.

このテーブルの django 管理インターフェースは遅すぎます。dB 負荷なしでロードするには約 30 秒かかります。また、データベースが何らかのジョブを実行している場合、ロードには通常 2 分以上かかります。通常、このテーブルには 1 週間または 2 週間ごとに 100 万件のレコードが追加されます。データベースやシステムのパフォーマンスを改善する方法はありますか、それとも現在のロード時間は正常ですか?

モデル管理者がいますがlist_select_related = True、これが唯一遅くなる可能性があるようです。Tokensおよび と結合しAlertsます。

于 2012-12-19T20:22:47.673 に答える
4

2番目の質問について:

このテーブルの django 管理インターフェースは遅すぎます。dB 負荷なしでロードするには約 30 秒かかります。また、データベースが何らかのジョブを実行している場合、ロードには通常 2 分以上かかります。

それは遅いクエリのようですか?開始するのに適した場所は、実行されているクエリを確認し (django デバッグ ツールバー)、データベースが提供するツールを使用してexplainそれらをデバッグし、適切なインデックスを追加することです。


django 1.4bulk_createでは、挿入のためにネットワーク経由でデータを転送するのにかかる時間を少なくとも削減するメソッドが追加されましたか?

于 2012-12-19T20:15:53.877 に答える
0

私は最近まったく同じ問題を経験しており、回避策を見つけるために深く掘り下げて、Django 管理者が 1 億以上のレコードを持つテーブルをハミングするようにする必要がありました。私の問題は、ページの読み込み時に高価なCOUNT(*)クエリになりsearch_fieldsModelAdmin.

多くの調査と熟考の後、いくつかの優れた解決策を思いつき、ここに文書化しました:http://craiglabenz.me/2013/06/12/how-i-made-django-admin-scale/

于 2013-06-14T21:36:50.237 に答える