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

相关文章
相关标签/搜索