MySQL如何执行关联查询

MySQL中关联一次意义比较广泛,并不仅仅是一个查询需要到2个表匹配才叫关联,而是任何一个查询都是一次关联,每一个查询,片段(包括子查询单表的查询)都可能是关联

当前 MySQL 关联执行策略很简单:MySQL 对任何关联都执行嵌套循环关联操作,即 MySQL 现在一个表中循环取出单条数据,然后再嵌套到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。MySQL 会尝试在最后一个关联表中找到所有匹配的行,如果最后一个关联表无法找到更多的行以后,MySQL 返回到上一次关联表,看是否能够找到更多匹配记录,依次迭代执行

按照这样的方式查找第一个表记录,再嵌套查询下一个关联表,然 后回溯到上一个表,在MySQL中是通过嵌套循环的方式实现——正如 其名 嵌套循环关联

mysql> select tbl1.col1,tbl2.col2  from tbl1 inner join tbl2 using(col3) where tbl1.col1 in(5,6);

假设mysql按照查询中的表顺序进行关联操作,我们则可以用下面的伪代码表示mysql将如何完成这个查询:

outer_iter = iterator_over tbl1 where col1 in(3,4)
outer_row = outer_iter.nextwhile outer_rowinner_iter = iterator over tbl2 where col3=outer_row.col3inner_row = inner_iter.nextwhile inner_rowoutput[outer_row.col1,inner_row.col2]inner_row = inner_iter.nextendout_row = outer_iter.next
end

上面的执行计划对于单表查询和多表关联查询都适用,如果是一个单表查询,那么只需要完成上面的外层的基本操作。对于外连接和上面的执行过程任然适用。例如我们将上面的查询修改如下:

mysql> SELECT tbl1.col1 ,tbl2.col2 FROM tbl1 left outer join tbl2 using (col3)WHERE tbl1.col1 in (3,4)

伪代码

outer_iter = iterator over tbl1 where col1 in(3,4)
outer row = outer_iter.next
while outer_rowinner_iter = iterator over tbl2 where col3 = outer_row.col3inner_row = inner_iter.nextif inner row   while inner_rowout_put [outer_row.col1,inner_row.col2]inner_row = inner_iter.nextendelse         out_put[outer_row.col1,NULL]         endouter_row = outer_iter.next
end

另一种可视化查询执行计划的方法是根据优化器执行的路径绘制出 对应的“泳道图”请从左至右,从上至下地看这幅图。

从本质上说,MySQL对所有的类型的查询都以同样的方式运行。 例如,MySQL在FROM子句中遇到子查询时,先执行子查询并将其结果 放到一个临时表中,然后将这个临时表当作一个普通表对待(正如 其名“派生表”)。MySQL在执行UNION查询时也使用类似的临时表,在遇到右外连接的时候,MySQL将其改写成等价的左外连接。简而言之,当前版本的MySQL会将所有的查询类型都转换成类似的执行计划

不过,不是所有的查询都可以转换成上面的形式。例如,全外连接 就无法通过嵌套循环和回溯的方式完成,这时当发现关联表中没有找到 任何匹配行的时候,则可能是因为关联是恰好从一个没有任何匹配的表 开始。这大概也是MySQL并不支持全外连接的原因。还有些场景,虽 然可以转换成嵌套循环的方式,但是效率却非常差

MySQL 生成查询的一颗指令树,然后通过存储引擎执行完成这颗指令树big返回结果,任何多表查询都可以使用一棵树表示

在计算机科学中,这被称为一颗平衡树。但是,这并不是MySQL 执行查询的方式。正如我们前面章节介绍的,MySQL总是从一个表开 始一直嵌套循环、回溯完成所有表关联。所以,MySQL的执行计划总是一棵左测深度优先的树

mysql> explain select u.id,c.id from sys_user u left join sys_area  c on c.id = u.city_id where u.id > 3;+----+-------------+-------+------------+--------+---------------+---------+---------+--------------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref          | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------+------+----------+-------------+
|  1 | SIMPLE      | u     | NULL       | range  | PRIMARY       | PRIMARY | 8       | NULL         |   10 |   100.00 | Using where |
|  1 | SIMPLE      | c     | NULL       | eq_ref | PRIMARY       | PRIMARY | 8       | hr.u.city_id |    1 |   100.00 | Using index |
+----+-------------+-------+------------+--------+---------------+---------+---------+--------------+------+----------+-------------+
2 rows in set (0.06 sec)

可以看出,首先在 sys_user 表上进行范围查询,筛选出 u.id > 3 的数据,然后在进行"嵌套查询"。

MySQL如何执行关联查询相关推荐

  1. 关联查询mysql_《MySQL数据库》关联查询

    原标题:<MySQL数据库>关联查询 一.关联查询 1.概念 在查询数据时,所需要的数据不只在一张表中,可能在两张或多张表中.这个时候,需要同时操作这些表来查询数据,即关联查询. 关联查询 ...

  2. MySQL中的关联查询

    MySQL中的关联查询 (1)Question:关联是什么 关联是SQL语言中使用SELECT操作表的一种操作机制,用来联系两个或者多个表.SELECT是SQL中的查询语句,用于查询数据库中的数据.将 ...

  3. mysql一对多关联查询分页_mysql一对多关联查询分页错误问题的解决方法

    xml问价中查询数据中包含list,需要使用collection .... .... 这样的查询系统封装的通用分页查询是不对的,所以需要自己sql中加入分页解决 SELECT you.nick_nam ...

  4. mysql数据关联查询_《MySQL数据库》关联查询

    原标题:<MySQL数据库>关联查询 一.关联查询 1.概念 在查询数据时,所需要的数据不只在一张表中,可能在两张或多张表中.这个时候,需要同时操作这些表来查询数据,即关联查询. 关联查询 ...

  5. MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?

    这里写目录标题 MySQL多表关联查询对比多次单表查询,哪个效率高? 疑问: 高手解答: <阿里巴巴JAVA开发手册>里面写超过三张表禁止join 这是为什么?这样的话那sql要怎么写? ...

  6. MySQL中,关联查询的3种写法…

    原文地址:MySQL中,关联查询的3种写法(USING/ON) 作者:王小安 看看下面三个关联查询的 SQL 语句有何区别? [sql]  view plain copy SELECT * FROM  ...

  7. mysql 表与表之间的条件比对_《MySQL数据库》关联查询

    一.关联查询 1.概念 在查询数据时,所需要的数据不只在一张表中,可能在两张或多张表中.这个时候,需要同时操作这些表来查询数据,即关联查询. 关联查询所涉及到的表与表之间都会存在有关联的字段,如员工表 ...

  8. MySQL多表关联查询与存储过程

    --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积 ...

  9. msql查询姓名不带r的员工姓名_《MySQL数据库》关联查询

    一.关联查询 1.概念 在查询数据时,所需要的数据不只在一张表中,可能在两张或多张表中.这个时候,需要同时操作这些表来查询数据,即关联查询. 关联查询所涉及到的表与表之间都会存在有关联的字段,如员工表 ...

  10. Mysql多表关联查询

    ​​​​​三表(replay_case.replay_task及general_flow)联合查询,注意select时,如果某个字段在不同的表中有重复的话需要指定具体的表,比如应该使用:select ...

最新文章

  1. php批量请求url_php请求url的方法小结
  2. php扩展实现hook,ThinkPHP3.2 扩展(钩子,HOOK)
  3. 内核程序实现多文件的调用
  4. 职称计算机还用考试,职称计算机考试注意事项
  5. 1206封装电容在物料可靠性设计比较低
  6. PSPad 免费文本编辑器推荐
  7. 学习OpenCV思维导图
  8. HTML5能取代Android和iOS应用程序吗?
  9. 计算机的五笔咋么学,电脑五笔输入法怎么学
  10. 点集求最小包围盒OBB算法
  11. JAMA Psychiatry:老年抑郁症患者的神经影像学、认知、临床症状和遗传学的异质性表征
  12. 动态设置Button图片大小
  13. MSP430的BSL下载经验
  14. python 逆序_python中逆序
  15. 树莓派应用:无线扫描仪
  16. 【深度学习】深度学习入门:投身深度学习你需要哪些准备?
  17. css3 特效大全,CSS3 特效范例整理
  18. 面经 | 腾讯/阿里/京东/头条/旷视等20+企业计算机视觉算法岗面经吐血整理
  19. Springboot添加白名单Ip
  20. docker ——安装tomcat

热门文章

  1. 搏一搏,单车变摩托!华为天才少年耗时四月将自行车强势升级为自动驾驶
  2. WindowBuilder的使用----java前端的重要框架
  3. 资源分享·病毒样本下载资源分享
  4. 计算机录入技术五笔输入法教案,五笔输入法教案
  5. Lingo11 解决优化问题( 下载和运行 )
  6. pp助手苹果版本_pp 助手停止服务/共享 ID 结束,旧版应用还能这样下载
  7. 『C#基础』多线程笔记「一」基本说明
  8. 2021L3HCTF luuuuua Writeup
  9. 什么是网络,网络类型,网络结构
  10. 汽车防撞之FMCW(调频连续波)原理