Djangoはデータベースのパフォーマンスの最適化を照会します

今、ユーザ情報データテーブルがある、など10のユーザーの名前、ニックネーム、年齢、仕事、下記の表、

モデルファイル

django.db輸入モデルからの
    
    クラスジョブ(models.Model):
        タイトル= models.CharField(max_lengthを= 32)
    
    クラスのUserInfo(models.Model):
        ユーザ名= models.CharField(max_lengthを= 32)
        愛称= models.CharField(max_lengthを= 32)
        ジョブ= models.ForeignKey(= "ジョブ"に、to_field = "ID"、ヌル= TRUE)

  テーブルに記録されたデータ

 

   さらに、ワークシートのユーザーに記録されているテーブルは、ユーザの作業は、関連分野

 

   各ユーザーのユーザー名、ニックネーム、およびジョブ情報を識別するために、

インデックスDEF(要求):
        user_list = models.UserInfo.objects.all()
    
        印刷(user_list.query)#使用クエリ印刷
        プリント(タイプ(user_list))の#印刷クエリ結果をデータ型
    
        user_listでのユーザーのために:
    
            印刷( "%のS - > S% - > S%" %(user.username、user.nickname、user.job.title))
    
        のレンダリングを返す(リクエスト、 'index.htmlを')

  印刷情報

"app01_userinfo" FROM "app01_userinfo"。 "ID"、 "app01_userinfo"。 "ユーザー名"、 "app01_userinfo"。 "ニックネーム"、 "app01_userinfo"。 "JOB_ID"を選択し
、<クラスのdjango.db.models.query.QuerySet '> 
USER1 - > USER1 - >のpython 
はuser2 - > user2は- > linuxの
ユーザー3 - >ユーザー3 - > golang 
USER4 - > USER4 - > pythonの
ユーザ5 - >ユーザ5 - > Linuxの
user6 - > user6 - > golang 
user7 - > user7 - >のpython 
USER8 - > USER8 - > linuxの
user9 - > user9 - > golang 
user10 - > user10 - > linuxの

  これらの操作は、サービス側で行われ、これらのクエリのパフォーマンスが非常に低い、重要な情報10ユーザの名前、ニックネームを横断して、他の仕事は2つのクエリでデータベース、唯一の最初のユーザーテーブルを11回実行しますすべてのユーザレコードを特定し、クエリを実行する必要がある、クエリジョブデータテーブル、各サイクルのユーザー情報のリスト、あなたはジョブテーブルから作業者情報を照会する必要があり、データテーブルには、10のユーザレコードの合計を記録しましたそう、それはジョブテーブルクエリからすべてのユーザーのためのジョブ情報を完了するために、10サイクルを必要とするので、あなたは、データベースクエリ操作を実行する必要があります11回の合計は、その後、データベースクエリの効率を改善するためのより良い方法がある何かありますか?

インデックスDEF(要求):
        user_list = models.UserInfo.objects.values( "ユーザ名"、 "ニックネーム"、 "ジョブ")
    
        を印刷(user_list.query)#使用クエリーの印刷時
        の印刷(タイプ(user_list))#プリントをクエリ結果のデータ・タイプ
        :印刷(、user_list "user_list")
    
        user_listでのユーザーのために:
    
            印刷(ユーザー[ "ユーザー名"]、ユーザー[ "ニックネーム"]、ユーザー[ "仕事"]) 
    レンダリング要求、「インデックスを返します。 HTML「)

  プログラムを実行し、サーバー上の背景情報を印刷します:

。。。 "app01_userinfo" FROM "app01_userinfo" "ユーザ名"、 "app01_userinfo" "ニックネーム"、 "app01_userinfo" "JOB_ID" SELECT 
<クラスのdjango.db.models.query.QuerySet '> 
<クエリセット[{'名:user_listを': 'USER1'、 'ニックネーム': 'USER1'、 'ジョブ':1}、{'ユーザ名': 'USER2'、 'ニックネーム': 'USER2'、 'ジョブ':2}、{'ユーザ名」: 'USER3'、 'ニックネーム': 'USER3'、 'ジョブ':3}、{ 'ユーザ名': 'USER4'、 'ニックネーム': 'USER4'、 'ジョブ':1}、{ 'ユーザ名':「ユーザ5 」、 'ニックネーム': 'ユーザ5'、 'ジョブ':2}、{ 'ユーザ名': 'user6'、 'ニックネーム': 'user6'、 'ジョブ':3}、{ 'ユーザ名': 'user7'、 'ニックネーム': 'user7'、 'ジョブ':1}、{ 'ユーザ名': 'USER8'、 'ニックネーム': 'USER8'、 'ジョブ':2}、{」ユーザ名': 'user9'、 'ニックネーム': 'user9'、 'ジョブ':3}、{'ユーザ名」: 'user10'、 'ニックネーム': 'user10'、 'ジョブ':2}]> 
USER1 USER1 1 
user2はuser2の2 
USER3 USER3 3user1のuser1の1 user2はuser2の2 USER3 USER3 3user1のuser1の1 user2はuser2の2 USER3 USER3 3 
USER4 USER4 1 USER4 USER4 1 USER4 USER4 1
ユーザ5ユーザ5 2 
user6 user6 3 
user7 user7 1 
USER8 USER8 2 
user9 user9 3 
user10 user10 2

  あなたが見ることができ、user_listクエリがまだクエリセットであるが、これは本当に辞書内のオブジェクトのコレクションが、今回でクエリは二回しかデータベースクエリを実行され、この方法で、あなただけの2つのクエリを必要としたい得ることができますデータをデータベースクエリの効率を最適化します

 

ジャンゴselect_relatedイニシアチブにもテーブルクエリのデータベースの最適化

  上記の例では、オブジェクトのコレクションに時間が、唯一の他のデータテーブルを照会することはできません、現在のデータテーブルを照会することができますか?もちろんそうではない、ここではすべてに、この方法では、最初のクエリを使用することができますまた、select_related( )活性でselect_relatedもテーブルクエリ、これら2つのデータテーブルを作成する際SELECT_を追加した後にだけ、ユーザクエリデータベースを記録しないように、ForeignKeyのようなユーザデータテーブルにジョブがしながら、存在し、続いてまた、テーブル内のレコードのジョブデータを確認します

インデックスDEF(要求):
        。user_list = models.UserInfo.objects.all()select_related( "ジョブ")
    
        を印刷(user_list.query)#使用クエリーの印刷時
        の印刷を(タイプ(user_list))#印刷データのクエリ結果タイプ
        印刷する( "user_list:"、user_list)
    
        user_listでのユーザーのために:
    
            印刷( "%はS - > S% - > S%" %(user.username、user.nickname、user.job.titleは))
    
        のレンダリングを返します(リクエスト、 'index.htmlを')

  サーバーの印刷結果

"app01_userinfo"。 "ID"、 "app01_userinfo"。 "ユーザー名"、 "app01_userinfo"。 "ニックネーム"、 "app01_userinfo"。 "JOB_ID"、 "app01_job"。 "ID"、 "app01_job"を選択します。 "タイトル" FROM " app01_userinfo」LEFT OUTER JOIN "" ON app01_jobを( "app01_userinfo JOB_ID "= "app01_job ID "が"。"、"。")
<クラスのdjango.db.models.query.QuerySet '> 
user_list:<クエリセット[<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト> 、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>]> 
USER1 - > USER1 - >のpython 
はuser2 - > user2は- > linuxの
ユーザー3 - >ユーザー3 - > golang 
USER4 - > USER4 - > Pythonの
ユーザ5 - > user5- - > Linuxの
user6 - > user6 - > golang 
user7 - > user7 - >パイソン
USER8 - > USER8 - > linuxの
user9 - > user9 - > golang 
user10 - > user10 - > Linuxの

  :を含むクエリアウト表示、印刷、

app01_userinfo "から " "(app01_userinfo " "JOB_ID" = "app01_job"。 "ID")" ON" app01_jobを" LEFT外部結合します"

  クエリを行うために使用される、あなただけの1を必要とするすべてのデータを確認することができます

  同様に、あなたはそれにジョブDESCテーブルに参加するだけのクエリで、そのような外部キーフィールドDESCの追加として、テーブルで作業を継続したい場合

 user_list = models.UserInfo.objects.all()。select_related( "job__desc")

  結果は置くとしてリンクされ、3つのテーブルでも、テーブルを照会していないが、我々はあなたが似てmodels.userinfo.objects.all()ステートメントのクエリを使用している場合、のみ、クロステーブルのクエリを実行していない、適用フィールドがForeignKeyのあることを確認する必要があります現在のクエリデータテーブルの一部、あなたがselect_related追加するには、他のテーブル内のデータ(ForeignKeyのフィールド名)をチェックしたい場合はそうでない場合は、クエリのパフォーマンスは、多くのことをドロップします。あなたは、複数のForeignKeyのフィールドからデータを取得したい場合は、select_relatedを使用することができます(、... ForeignKeyのフィールド1、ForeignKeyのフィールド2)はアクティブクエリテーブルで使用されselect_relatedもテーブルクエリのパフォーマンスが低下します。

 

非アクティブ分割表クエリの動作を最適化するためperfetch_related Djangoのデータベース

perfetch_related方法は、非アクティブなコンティンジェンシー・テーブルのクエリで、妥協のクエリの多くはいけません

ビュー機能インデックスを変更します

インデックスDEF(要求):
    
        。user_list = models.UserInfo.objects.all()prefetch_related( "ジョブ")
    
        を印刷(user_list.query)#を使用する場合、クエリの印刷
        プリント(タイプ(user_list))#印刷データのクエリ結果をタイプ
        印刷する( "user_list:"、user_list)
    
        user_listでのユーザーのために:
    
            印刷( "%はS - > S% - > S%" %(user.username、user.nickname、user.job.titleは))
    
        のレンダリングを返します(リクエスト、 'index.htmlを')

  バックエンドの結果を出力します。

"app01_userinfo" FROM "app01_userinfo"。 "ID"、 "app01_userinfo"。 "ユーザー名"、 "app01_userinfo"。 "ニックネーム"、 "app01_userinfo"。 "JOB_ID"を選択し
、<クラスのdjango.db.models.query.QuerySet '> 
user_list:<クエリセット[<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo。 UserInfoオブジェクト>]>:のUserInfoオブジェクト>、<のUserInfo::のUserInfoオブジェクト>、<オブジェクトのUserInfo>、<のUserInfoのUserInfo 
> USER1 - - >のpython USER1 
はuser2 - > user2は- > Linuxの
ユーザー3 - > user3- - > golang 
USER4 - > USER4 - >python 
ユーザ5 - >ユーザ5 - > linuxの
user6 - > user6 - > golang 
user7 - > user7 - >のpython 
USER8 - > USER8 - > linuxの
user9 - > user9 - > golang 
user10 - > user10 - > Linuxの

  perfetch_related未架橋テーブルクエリ操作を使用する方法は、2回実施され、ユーザがチェックアウトJOB_IDテーブル内のすべてのデータを、すべてのユーザーテーブルのすべてをチェックし、重複排除処理を実行します。作業のクエリ結果3種類のユーザーが次に実行されますクエリ役職フィールドデータテーブルselect文、クエリがperfetch_related JOB1の方法でフィールドを追加し、2倍のデータテーブルを実行されるように、データベースクエリを2回実施されます。

 

Djangoのデータベースの最適化作業の唯一の方法:

インデックスDEF(要求):
        。user_list = models.UserInfo.objects.all()のみ( "ユーザ名")
    
        を印刷(user_list.query)#使用クエリ印刷
        プリント(タイプ(user_list))#印刷データのクエリ結果をタイプ
        :印刷(、user_list "user_list")
    
        user_listでのユーザーのために:
    
            印刷( "%Sを- > S%" %(user.username、user.nickname))
    
        のレンダリングを返す(リクエスト、 'index.htmlを')

  スプールサーバ情報

。。 "app01_userinfo" FROM "app01_userinfo" "ID"、 "app01_userinfo" "ユーザー名"を選択し
、<クラスのdjango.db.models.query.QuerySet '> 
user_list:<クエリセット[<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>]> 
USER1 - > USER1 
USER2 - > USER2 
USER3 - > USER3 
USER4 - > USER4 
ユーザ5 - >ユーザ5 
user6 - > user6 
user7 - > user7 
USER8 - > USER8 
user9 - >user9 
user10 - > user10

  クエリ操作を加えた結果、唯一の方法またはオブジェクトのコレクションを実行していますが、クエリのプリントアウトから見ることができた場合、クエリは動作が実行され、唯一のユーザーIDフィールドとユーザー名フィールド、およびクエリなしのニックネームフィールドを照会しかし、要求がこのようだけ背面に、クエリフィールド法に加え唯一の方法を使用してそのクエリを通知し、クエリの動作を実行したため、なぜ、サイクルの後ろに、ユーザのニックネーム情報を印刷することができ唯一の引数を追加し、使用されているクエリフィールドには、クエリの結果から、唯一のフィールドを取ることであり、他の方法は、中で焼成クエリからフィールドを除外するために延期することです。

 

ジャンゴのデータベースの最適化は、メソッドを延期します

延期ビュー機能を変更します。

インデックスDEF(要求):
    。user_list = models.UserInfo.objects.all()延期( "ユーザ名")

    を印刷(user_list.query)#使用クエリ印刷
    プリント(タイプ(user_list))#印刷データのクエリ結果をタイプ
    印刷( "user_list:"、user_list)

    user_listでのユーザーのために:

        印刷( "%S" %のuser.nickname)

    レンダリング(要求、 'index.htmlを')を返します

  プリントサーバ情報

。。。 "app01_userinfo" FROM "app01_userinfo" "ID"、 "app01_userinfo" "ニックネーム"、 "app01_userinfo" "JOB_ID" SELECT 
<クラスのdjango.db.models.query.QuerySet '> 
<クエリセット[<のUserInfo:user_listを: UserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>、<のUserInfo:のUserInfoオブジェクト>]> 
USER1 
はuser2 
user3に
USER4 
ユーザ5 
user6 
user7 
USER8 
user9 
user10

  利用延期方法が唯一のデータベースからユーザーIDフィールド操作およびユーザーのニックネームフィールドを照会した後、クエリの印刷によって知ることができ、また、データベースのパフォーマンスを向上させることができ、無照会ユーザー名フィールドは、Djangoに照会しません

 

おすすめ

転載: www.cnblogs.com/panshao51km-cn/p/11563213.html