[ジャンゴ+マイクロチャネル小さな開発者は】08Django層最適化モデル

Djangoのモデルレイヤ最適化

まず、私の究極の目標は、私はこのシリーズを見てあなたには、いくつかの有用な要素を表示することができますが、いくつかの要素は、私は、レコード全体ではなく、プロジェクトのコレクションを記録する必要があるノートです、PythonDjango +キャンパスのマイクロチャネルのアプリケーションアプレットを開発することです。

Djangoのモデルレイヤ変更および移行:

  • makemigrationのAPPNAME
  • データベースを実行する移行
  • SQL文の実装を参照するにはselmigrate appnameの0014(20)
  • showmigrationのappnameの変更履歴の表示アプリケーションと移行の歴史

Djangoのモデル層 - 遅延ロード、プリロード

  • 問題遅延ロードのルート
    • 不透明なORMフレームワーク
      • クエリの後ORMフレームワークは、2つのSQL文に変わるだろう
      • ORMフレームワークを介して2つのステッチには、クエリに変換することができません
    • レイジーローディング
      • 多くの外部キー関係と多くのがあります
      • オブジェクトに関連するデータを取得しません
      • 再びデータベースを照会し、関連するオブジェクトを呼び出します
    • ビューDjangoORMデータのロード
      • 実際、2つの要求
  • 事前にロードされたメソッド
    • シングル関連オブジェクトのプリロード-select_related
    • 関連する複数のオブジェクトをプリロード-prefetch_related
    • ユーザー= User.object.prefetch_related(「メニュー」)
    • ユーザー[0] .menu.all()
  • 比較パフォーマンスデータ
    • 怠惰よりもはるかに高速負荷のプリロード
    • オブジェクト関連するクエリオブジェクトには、(パフォーマンスを向上させるために)プリロードされなければなりません
Djangoの層の最適化モデル(ロングリンク)
  • 処理ロジック、データベース接続
    • 各要求を繰り返しデータベースに接続されます
    • 多くの場合、各繰り返し:-1--、--1--、しばしば接続:-1111-
    • 巨大な圧力にもサービスに対する高い要求を同時に扱います
    • 高い同時サービスを実行することができません。
  • 負の最適化を避けます
    • 位置記憶データベース接続:スレッドローカル変数
    • データベースによってサポートされる接続の最大数
      • コマンドラインのNavicatを開きます。
      • 「%のmax_connectionの%」のような変数を表示。
      • 200 = 200グローバルのmax_connectionsを設定
    • CONN_MAX_AGE(最大接続数)コンフィギュレーションガイド
      • 展開スレッドの数:N接続の<データベースの最大数
      • 開発モデルは、使用CONN_MAX_AGEにはお勧めしません
      • 各要求は、スレッドを作成します。
  • 理論的結果
    • 確立または近いイベント(5ミリ秒)DB接続
    • DBクエリイベント15msの
    • ショートリンク使用率:15 /(15 + 5 * 2)= 0.6
    • ロングリンク使用率15 3(15 3 + 5 * 2)= 0.82

Djangoのデータベースモデル層プラクティス

  • インデックスの適切な使用

    • インデックスは、インデックス付きの列でなければなりません
    • インデックスは、列をインデックス化するべきではないではありません
  • 使用イテレータイテレータ反復クエリセット

    • クエリセット、非常に大きな、イテレータはメモリを保存するとき
  • プロパティキャッシュオブジェクトを理解します

    • プロパティ呼び出すことはできません。これは、デフォルトのデータが外部キーが含まれていないです
    • 呼び出し可能なプロパティ:それは外部キー、データ、および多くに多く、関数呼び出しであってもよいし、
    • 再び呼び出されたときに呼び出し可能なPythonのは、変数に割り当てられた属性は、データベースを呼び出す必要はありませんが、(パフォーマンスを向上させるために)データPythonの変数を呼び出すことができます
  • データベースを作成するデータベースの作業
    • フィルタ:除外し、フィルタ属性
    • 重合:機能の注釈を使用して重合
    • 必要な場合には、ネイティブSQLを使用します
  • データを取得する権利
    • フィールドが使用インデックス検索され
    • ユニークな変更されたフィールド検索の使用
  • 不要な検索をしないでください
    • 使用クエリセット値()、VALUE_LIST()関数が返す容器のPythonの構造
    • 代わりLENのQuerySet.countを(使用してクエリ結果)の長さ(クエリセット)
    • 裁判官は、クエリセットならば代わりに)(ヨーヨーQuerySet.existsを空かどうか
  • 不要なソートをしないでください
    • 不要なソートをしないでください
  • バッチ操作
    • 大量のデータ、バルク・オペレーション
公開された63元の記事 ウォンの賞賛0 ビュー1175

おすすめ

転載: blog.csdn.net/qq_37463791/article/details/104709459