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