ORM数据库查询优化only与defer(select_related与prefetch_related)
2022/3/7 2:15:12
本文主要是介绍ORM数据库查询优化only与defer(select_related与prefetch_related),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- 一:数据库查询优化
- 1.ORM语句特点
- 2.only
- 3.defer
- 4.only与defer区别
- 5.select_related与prefetch_related
- 6.select_related
- 7.select_related概括
- 8.prefetch_related
- 9.prefetch_related概括
- 10.select_related与prefetch_related区别
一:数据库查询优化
-
only与defer的数据查询优化
-
select_related与prefetch_related数据查询优化
1.ORM语句特点
惰性查询 如果你仅仅只是书写了orm语句 在后面根本没有用到该语句所查询出来的参数 那么orm会自动识别 直接不执行 示例: res = models.Book.objects.all() print(res) # 要用数据了才会走数据库
2.only
# 实现获取到的是一个书籍对象 然后点title就能够拿到书名 并且没有其他字段 res = models.Book.objects.only('title') # res = models.Book.objects.all() for i in res: print(i.title) # 点击only括号内的字段 不会走数据库 # print(i.price) # 点击only括号内没有的字段 会重新走数据库查询 # 而all不需要走数据库
3.defer
# 对象除了没有title属性之外 其他的都有,除了title走数据库,其他都不需要走数据库 res = models.Book.objects.defer('title') for i in res: print(i.title)
4.only与defer区别
defer与only刚好相反 defer括号内的字段不在查询出来的对象里面 查询该字段需要重新走数据 而如果查询的是非括号内的时候 则不需要走数据库
5.select_related与prefetch_related
6.select_related
# 拿到每一本书对应的出版社 res = models.Book.objects.select_related('publish') # INNER JOIN for i in res: print(i.publish.name)
7.select_related概括
1.select_related内部直接先将book与publish连接起来 2.然后一次性将大表里面的所有数据全部封装给查询出来的对象 3.这个时候对象无论是点击book表数据还是publish的数据都无需再走数据库查询了 select_related括号内只能放外键字段 一对一 一对一 多对多也不支持
8.prefetch_related
res = models.Book.objects.prefetch_related('publish') # 子查询 for i in res: print(i.publish.name)
9.prefetch_related概括
prefetch_related该方法内部其实就是子查询 将子查询查询出来的所有结果也给你封装到对象中 给你的感觉好像也是一次性搞定的
10.select_related与prefetch_related区别
select_related: 相当于是INNER JOIN 将两张表拼接起来! prefetch_related: 相当于是 子查询 分布查询!
这篇关于ORM数据库查询优化only与defer(select_related与prefetch_related)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27文件掩码什么意思?-icode9专业技术文章分享
- 2024-12-27如何使用循环来处理多个订单的退款请求,代码怎么写?-icode9专业技术文章分享
- 2024-12-27VSCode 在编辑时切换到另一个文件后再切回来如何保持在原来的位置?-icode9专业技术文章分享
- 2024-12-27Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品 审核中
- 2024-12-27TypeScript面试真题解析与实战指南
- 2024-12-27TypeScript大厂面试真题详解与解析
- 2024-12-26怎么使用nsenter命令进入容器?-icode9专业技术文章分享
- 2024-12-26导入文件提示存在乱码,请确定使用的是UTF-8编码怎么解决?-icode9专业技术文章分享
- 2024-12-26csv文件怎么设置编码?-icode9专业技术文章分享
- 2024-12-25TypeScript基础知识详解