django shell ipython 模型層優化(關聯對象) 懶加載和預加載 +長連接

懶加載

存在於外鍵和多對多關係
不檢索關聯對象的數據
調用關聯對象會再次查詢數據庫html


問題根源


查看django orm的數據加載,兩次. 查詢user,查詢menupython

第一次查詢 用戶表  第二次查詢 app表sql

cmd:python manage.py shell #進入shell調試 或者ipython
from authorization.models import User
users=User.objects.all()
print(users.query) #打印sql語句 ,第一次查詢user

user=users[0]
user_menu=user.menu.all()
print(user_menu.query)  #第二次查詢menu

  

 

預加載的方法


預加載單個關聯對象--select_related
!!!預加載多個關聯對象--prefetch_relatedshell

 

性能對比:測試時 預加載快了三倍左右


# 懶加載
def lazy_load():
  for user in User.objects.all():
  print(user.menu.all())數據庫

# 預加載
def pre_load():
  for user in User.objects.prefetch_related('menu'):
  print(user.menu.all())django

 

長連接

盡少的連接次數,集中查詢app

由於建立和關閉連接的時間和單詞查詢的時間相似,一開一關大大浪費性能性能

 

避免負優化:測試

  使用CONN_MAX_AGE配置限制DB鏈接壽命fetch

  CONN_MAX_AGE默認值是0

  每一個DB鏈接的壽命保持到該次請求結束

  不建議開發模式下使用CONN_MAX_AGE

 

部署線程數 必定要小於 數據庫最大鏈接數

django-debug-toolbar

https://www.cnblogs.com/liwenzhou/p/9245507.html

相關文章
相關標籤/搜索