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


懶加載

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


問題根源


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

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

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_related

 

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


# 懶加載
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())

 

長鏈接

盡少的鏈接次數,集中查詢

因為創建和關閉鏈接的時間和單詞查詢的時間類似,一開一關大大浪費性能

 

避免負優化:

  使用CONN_MAX_AGE配置限制DB連接壽命

  CONN_MAX_AGE默認值是0

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

  不建議開發模式下使用CONN_MAX_AGE

 

部署線程數 一定要小於 數據庫最大連接數

django-debug-toolbar

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM