django ipython shell_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值