子查询与关联查询区别

1.子查询
1.1. MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作
1.2.子查询虽然很灵活,但是执行效率并不高
1.3.执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程
2.连接查询(join)
2.1.可以使用连接查询(JOIN)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快
总结:连接查询效率高于子查询!!!
扩展:多表联查性能优化
优化的本质就是(join on 和where的执行顺序)!!!
1.数据库在通过连接两张或多张表来返回记录时,都会生成一张 中间的临时表,然后再将这张临时表返回给用户
注意:这张临时表是数据库(MySQL自动生成)
2.在使用left jion on时,on和where条件的区别如下:

2.1.on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录
2.2.where条件是在临时表生成好后,再对临时表进行过滤的条件(这时已经和left join没关系了),条件不为真的就全部过滤掉
1
2
3.left join on + where条件查询的索引优化实例分析:
sql:select * from A left join B on A.c = B.c where A.employee_id = 3
解读: A表left join B表,并且指定A表中的employee_id为一个具体的值

3.1.假设A表,B表均有10000多条数据;
3.2.使用上面的sql查询时间达到16秒(在c字段不是任何索引,用explain分析得知,AB表都使用了全表查询,效率极低)
3.3.开始优化上面sql
(1)给AB表列c都加索引(仅用了0.1s,但是分析后显示表A依然进行了全表扫描)
思考:为什么全表扫描的不是表B
因为Mysql内部的优化,使用小表驱动大表,它在估算到必须有一个表要全表扫描的话,一定会选择那个数据量更小的表去全表扫描,
也就是说,在这个查询中,因为on以后的where条件列并没有使用到索引,所以mysql的优化只用到了表B的c索引,没有用到表A的索引!
(2)我们有where条件查询,不需要全表扫描,此时就需要where条件生效,操作及分析如下:
1.将A表中的索引改为employee_id+c(经验证两个所以都使用了,方案可行)
思考:sql执行 from中的on应该是优先于where语句的,为什么这里employee_id反而在c之前,有违常理
因为Mysql内部优化,这一句Sql在执行的时候首先是选择了使用表B的索引来进行优化,将表A单独放出来进行后续的操作,
然后,又发现了where语句中A.employee_id有一个聚合索引,并且employee_id处于索引头,所以这个聚合索引是可用的,所以自然使用了此索引
2.即使把聚合索引后面的列c删掉,与使用聚合索引的效果是一样的,之前全表查询,现在根据条件只查询了满足条件的,时间大幅缩短

扩展:mysql连接查询中索引的重要性
1.连接查询通过两张表中符合连接关系的字段来建立两张表的关联,通常包括内连接、左外连接、右外连接和全连接
2.内连接会保留两张表中共有的那部分记录,因此最后产生的连接表记录数最少;
全连接会保留两张表中所有的记录,因此最后产生的连接表记录数最多;
左外连接会保留左表的全部记录,右外连接会保留右表的全部记录,因此最后产生的连接表记录数处于内连接和外连接之间。
3.我们可以给关联表的字段添加索引来减少查询次数,提高查询效率
4.使用多表关联时,一般遵循以下规则:
4.1.左连接:一般给右边表的关联字段建立索引;
4.2.右关联:一般给左边表的关联字段建立索引;
4.3.内连接:一般给关联表的任意一边的关联字段建立索引即可

举例:学生表student(id,name),课程表class(id,student_id,class),各有10000条数据
sql实例:SELECT a.id, name FROM student a
LEFT JOIN class b ON a.id = b.student_id
这个查询的执行速度非常慢!!
1.首先用explain查看这个语句的查询执行计划,可以看到type都为ALL,即在student表和class表中都使用的全表扫描
2.改进:试着给class表的student_id字段添加索引
alter table class add index class_index(student_id)
3.然后再次执行查询,发现速度非常快,这就是效率改进的关键点所在
4.当连接查询时产生的连接表过大时,为了防止查询次数过多,我们要经常使用索引来减少查询次数,提高查询效率
————————————————
版权声明:本文为CSDN博主「梦断若水」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq591009234/article/details/90901869

原文地址:https://www.cnblogs.com/minikobe/p/12359828.html

时间: 2024-11-09 01:06:06

子查询与关联查询区别的相关文章

子查询与关联查询哪个效果高

子查询: select a.*,(select workflowname from workflowbase where id=workflowid) workflownamefrom  [[zping.com]]] awhere a.operator='402882ed1112669201112a8385892f33' 执行结果: (360 行受影响)表 'Worktable'.扫描计数 360,逻辑读取 142334 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理

Oracle 高级查询1 关联查询 分组查询

高级查询 1.关联查询作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字 语法:select 列,列,列 from 表1 join 表2on 表1外键=表2主键 2.外联接 左外联[left outer join] 以关联的左边为准,即使右边没有与之匹配的记录,则左边的记录也要 出现在结果集中,右边全部以NULL值显示. 右外联[right outer join] 以关联的右边为准,即使左边没有与之匹配的记录,则右边的记录也要 出现在结果集中,左边全部以NULL值显示. 3分组查询

Mongoose如何实现统计查询、关联查询

[问题]Mongoose如何实现统计查询.关联查询 发布于 4 年前  作者 a272121742  13025 次浏览 最近业务上提出一个需求,要求能做统计,我们设计的文档集,统计可能跨越的文档会比较多,想问一下,mongoose能实现统计查询和关联查询吗? 例如student文档对象有subject文档对象,subject文档对象有score属,查询所有学员的成绩.我个人的思路就是一般的解决方案,先查询所有学员,再查询所有分数,然后遍历做累加统计 StudentDao.find().sele

高级查询,关联查询

高级查询 1.关联查询作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字//错误select first_name,name from s_emp,s_dept;//错误的原因:产生笛卡尔积(在查询两张表的时候,一张表中的数据与另一张表中的数据一一匹配),产生了冗余数据. //古老的写法:select first_name,name from s_emp,s_dept where s_emp.deop_id = s_dept.id; //现在的写法:select e.first_n

Mybatis高级查询之关联查询

3 关联查询 做查询之前,先修改几个配置.mapper.xml是在mybatis-config.xml中指定,那么我们每增加一个mapper都要增加一个配置,很麻烦.为了简化配置.需要将mapper接口和mapper.xml放到同一个文件下,并且接口和xml文件命名一致.使用mybatis的自动扫描:.这样,当我们新增接口的时候,直接创建接口和对应xml文件就可以了: <mappers> <!--<mapper resource="com.test.mapper.dao/

SQL笛卡尔积查询与关联查询性能对比

首先声明一下,sql会用略懂,不是专家,以下内容均为工作经验,聊以抒情. 今天帮忙验证同事发布的端口时,查看了一下相关sql内容,发现其使用的sql语句会导致笛卡尔积现象,为了帮其讲解进行了如下分析: student表: teacher表: course表: student_course表: 与发现问题类似的SQL1查询语句: SELECT d.st_name,d.class_id,d.st_id FROM course AS a, student_course AS b, teacher AS

Mysql - 查询之关联查询

? 查询这块是重中之重, 关系到系统反应时间. 项目做到后期, 都是要做性能测试和性能优化的, 优化的时候, 数据库这块是一个大头. sql格式: select 列名/* from 表名 where 条件 group by 列 having 条件 order by 列 asc/desc; 这里牵涉到一个查询执行顺序的问题. 单表查询执行顺序: select sex, count(Sex) as count from tch_teacher where id > 15 group by Sex h

(一)SQL关联查询的使用技巧 (各种 join)

---恢复内容开始--- (一)SQL关联查询的使用技巧 (各种 join) 这几天因为工作的时候,发现自己的sql语句基础不是很好,特意研究了一下,发现sql语句真的是博大精深,sql语句不仅是要查出来你想要的数据,更讲究查询的效率,因为在查询大量数据时往往会因为数据量大,造成效率很低,再加上前后台数据的交互,造成了访问延迟等等的一系列问题. 在我们的日常工作中往往用到很多的查询方式,例如 嵌套查询,关联查询,子查询等等,就我而言,我感觉关联查询是最容易学习,和效率最高的.下面就我总结的关联查

[转]NHibernate之旅(10):探索父子(一对多)关联查询

本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NHibernate查询语言(HQL,NHibernate Query Language).条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况).原生SQL(Literal SQL,T-SQL.PL/SQL).这一节分别使用这三种方式来