ORM数据库查询优化only与defer(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)的更多相关文章
- Django框架之第八篇(模型层补充)--数据库的查询与优化:only/defer,select_related与prefetch_related,事务
在设置外键字段时需要注意: 当你使用django2.x的版本时候,在建立外键关系时,需要你手动添加几个关键点参数 models.cascade #设置级联删除 db_constraints 数据库查询 ...
- django之ORM的查询优化、Ajax 06
目录 ORM查询优化 only与defer select_related与prefetch_related查询优化 choices参数 MTV与MVC模型 Ajax简介 AJAX常见应用情景 AJAX ...
- ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...
- python---django中orm的使用(5)数据库的基本操作(性能相关:select_related,和prefetch_related重点)(以及事务操作)
################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...
- Django数据库查询优化与AJAX
目录 数据库设计三大范式 orm相关的数据库查询优化 惰性查询 all.only与defer select_related与prefetch_related MTV与MVC模型 MTV(models ...
- Django常用字段及参数、事务、数据库查询优化
常用字段 注意: Django中没有设置对应char类型的字段,但可以支持自己定义. 自定义对应于数据库的char类型字段: from django.db.models import Field cl ...
- Django数据库查询优化-事务-图书管理系统的搭建
数据库查询优化 优化:虽然减轻了数据库的压力,但查询速度大大的减慢 ORM内所有的语句操作,默认都是惰性查询,只有你在真正的需要数据的时候才会走数据, 如果你只是写ORM语句时,是不会走数据库的,这样 ...
- Django 数据库查询优化
Django数据层提供各种途径优化数据的访问,一个项目大量优化工作一般是放在后期来做,早期的优化是“万恶之源”,这是前人总结的经验,不无道理.如果事先理解Django的优化技巧,开发过程中稍稍留意,后 ...
- Android高性能ORM数据库DBFlow入门
DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点.同时不是基于反射,所以性能也是非常高,效率紧跟greenDAO其后.基于注解,使用 ...
- 数据库查询优化器的艺术:原理解析与SQL性能优化
数据库查询优化器的艺术 作者:李海翔 Oracle公司MySQL全球开发团队.资深专家 简单的浏览了一遍,由于以前没有接触过SQL优化这些知识,读起来还是非常吃力的,不过收获还是很大的. 作者通过对M ...
随机推荐
- 我的 Kafka 旅程 - 文件存储机制
存储机制 Topic在每个Broker下存储所属的Partition,Partition下由 Index.Log 两类文件组成. 写入 Log 由多个Segment文件组成,每个Segment文件容量 ...
- SQL语句——为什么分组函数(多行处理函数)不能用在where语句之后?
在SQL语句中,常见的分组查询函数为: sum()求和 avg()求平均值 min()求最小值 max()求最大值 count()求数目 在分组函数中有几个重要的特征: 1.分组函数进行时自动忽略nu ...
- 洛谷P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles (DP入门)
考虑逆推就行了. 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int a[1010][1010]; 5 int ...
- C++函数模板和类模板的使用
一.函数模板 #include<iostream>using namespace std;template<class T1,class T2>T1 add(T1 x,T2 y ...
- uni-app 如何优雅的使用权限认证并对本地文件上下起手
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.起因 最近有一个需求,需要使用自定义插件,来对接硬件功能,需要配合对手机的权限进行判断和提示,并在对接后对本地文件进行操作,这里给大家 ...
- cudaMemcpy cudaMalloc
cudaMemcpy有四种类型:HostToHost, DeviceToHost, HostToDevice, DeviceToDevices 现在我有两个指针:h_ptr, d_ptr,分别指向ho ...
- Linux实战笔记_CentOS7_格式化磁盘
fdisk -l #检查是否添加成功(添加一块磁盘并重启计算机后) fdisk /dev/sdb #格式化磁盘 mount /dev/sdb1 /opt #挂载到/opt目录 df -h #查看是否挂 ...
- `<jsp:getProperty>`动作和`<jsp:setProperty>`动作的使用在一个静态页面填写图书的基本信息,页面信息提交给其他页面,并且在其页面显示。要去将表单元素的值赋值给Java
<jsp:getProperty>动作和<jsp:setProperty>动作的使用 1.<jsp:getProperty>动作 语法格式: <jsp:get ...
- 【JavaWeb】学习笔记——JSP
概念 全称:Java Server Pages, Java服务端页面 描述:一种动态的网页技术,可以在其中定义HTML.JS.CSS等静态内容,以及Java代码的动态内容 说明:JSP = HTML ...
- 部署RAID 10
额外添加4块硬盘,用于搭建RAID 10 检查linux的磁盘 [root@local-pyyu ~]# fdisk -l |grep '/dev/sd[a-z]' 磁盘 /dev/sda:21.5 ...