首页 > 数据库 >MySQL的驱动表与被驱动表

MySQL的驱动表与被驱动表

时间:2023-10-13 10:33:28浏览次数:48  
标签:Join 匹配 查询 表与 MySQL 驱动 Nested Loop

驱动表与被驱动表的含义

在MySQL中进行多表联合查询时,MySQL会通过驱动表的结果集作为基础数据,在被驱动表中匹配对应的数据,匹配成功合并后的临时表再作为驱动表或被驱动表继续与第三张表进行匹配合并,直到所有表都已匹配完毕,最后将结果返回出来。匹配算法:Nested-Loop Join(嵌套循环连接),在MySQL中有三种具体的实现算法:

  • Simple Nested-Loop Join:简单嵌套循环连接
  • Index Nested-Loop Join:索引嵌套循环链接
  • Block Nested-Loop Join:缓存快嵌套循环链接

Simple Nested-Loop Join

简单嵌套循环连接实际上就是简单粗暴的嵌套循环,如果驱动表有100条数据,被驱动表有100条数据,那么在匹配时会将驱动表的每一条数据作为匹配条件去被驱动表中逐个比较,实际上就要比较100*100=10000次,可以想象这种比较效率是非常低下的。

Index Nested-Loop Join

索引嵌套循环连接是基于被驱动表的索引进行连接的算法,通过驱动表的匹配条件与被驱动表的索引进行匹配,避免和每条记录比较,从而利用索引的查询减少匹配次数,提高查询的性能。但要注意的是被驱动表的关联条件必须要有索引时才能用到Index Nested-Loop Join。另外由于用到索引,如果是非聚簇索引并且查询的数据包含了被驱动表的其他字段,则会回到被驱动表再查询一次对应的数据,即回表,多了IO操作。

Block Nested-Loop Join

缓存嵌套循环连接通过一次性缓存多条驱动表数据、参与查询的列到Join Buffer里,然后拿Join Buffer里的数据批量与被驱动表中的数据进行比较,从而减少了循环匹配次数。

关于Join Buffer

  1. Join Buffer会缓存所有参与查询的列,而不是只有Join的匹配列
  2. 可以调整MySQL的join_buffer_size缓存大小,join_buffer_size的默认值是256K,最大值在MySQL 5.1.22版本前是4G,而之后的版本才能在64位操作系统下申请大于4G的空间
  3. 要使用Block Nested-Loop Join算法需要开启优化器管理配置的optimizer_switch的设置block_nested_loop为on,默认为on

当查询优化器不使用Index Nested-Loop Join算法的时候,默认使用Block Nested-Loop Join算法。

联合查询的性能优化原则

明白联合查询的原理是驱动表与被驱动表通过条件嵌套循环连接匹配后,查询性能优化的思路就是:减少循环比较次数。可以通过以下几个原则来进行优化。

1. 以数据量小的表作为驱动表,数据量大的表作为被驱动表。

通过上面的分析可以得知,MySQL在联合查询中是用驱动表的数据作为筛选条件在被驱动表中进行匹配,所以假设table1作为驱动表,数据有10000条,table2作为被驱动表的数据有100条,并且被table2中有索引,那么用Index Nested-Loop Join算法进行匹配时要进行10000次的关联操作。但如果反过来用table2作为驱动表,table1作为被驱动表,只需要进行100次关联即可完成匹配,效率也会大大提高,其他的连接算法也类似。简单说通常情况下要用小表驱动大表。
但是这里的小表和大表是根据查询条件相对而言的,大小的计算是要根据查询条件和具体的字段进行衡量,假如查询条件指定了table1的搜索范围,即table1满足查询条件的行数有90行,那么计算公式为:90乘以参与关联查询字段的大小总和,若结果小于table2满足查询条件后的行数乘以参与关联查询字段的大小,则table1为小表,否则table1为大表。

2. 为匹配的条件增加索引

匹配的条件字段列尽量使用有索引的,争取使用Index Nested-Loop Join算法进行关联,减少被驱动表的循环次数

3. 增大join_buffer_size的大小

当使用Block Nested-Loop Join算法时,增大join_buffer_size的大小可以使驱动表一次缓存更多的数据,从而减少总体循环匹配的次数

4. 减少不必要的字段查询

  • 当用到Block Nested-Loop Join算法时,字段越少,join Buffer所缓存的数据就越多,那么循环的次数就越少。
  • 当用到Index Nested-Loop Join算法时,如果可以不回表查询,即只查询索引列,利用覆盖索引则可能提升匹配效率

如何确定驱动表与被驱动表

  • 在使用join连接并且无where条件时:
    1. left join左边的表为驱动表,右边的为被驱动表
    2. right join右边的表为驱动表,左边的为被驱动表
    3. 使用join时,MySQL会自动判断左右两边哪边是小表,哪边是大表。小表作为驱动表,大表作为被驱动表,小表与大表的判断原则为上面讲到的根据行数和参与关联的字段计算得出。
  • 在使用in\exists时
    1. 使用in时,驱动表和被驱动表由MySQL的执行器根据表的大小自动选择
    2. 使用exists时,外部表为驱动表,内部表为被驱动表。无论加什么查询条件都无法改变

使用join连接查询时如果有where条件,则MySQL执行器会根据查询条件过滤后的结果自动选择驱动表或被驱动表。

标签:Join,匹配,查询,表与,MySQL,驱动,Nested,Loop
From: https://www.cnblogs.com/EricZhao-/p/17761481.html

相关文章

  • MHA设置mysql的主从及遇到的坑
    记录一下搭建MHA主从的完整过程,同时也把自己部署过程中遇到的坑写进来参考链接:https://blog.csdn.net/m0_49526543/article/details/109483659https://blog.csdn.net/hahaxixi131/article/details/122282665https://www.cnblogs.com/jiabrother/p/14108302.html 先说一下......
  • Skywalking APM监控系列(二、Mysql、Linux服务器与前端JS接入Skywalking监听)
    前言上篇我们介绍了Skywalking的基本概念与如何接入.NetCore项目,感兴趣可以去看看:SkywalkingAPM监控系列(一丶.NET5.0+接入Skywalking监听)本篇我们主要讲解一下Skywalking如何接入mysql数据库监听与Linux服务器的监听其实从Skywalking设计之初应该只是单独的链路跟踪,发......
  • MYSQL GROUP BY 对多个字段进行分组
    在平时的开发任务中我们经常会用到MYSQL的GROUPBY分组,用来获取数据表中以分组字段为依据的统计数据。比如有一个学生选课表,表结构如下:Table:Subject_SelectionSubjectSemesterAttendeeITB0011JohnITB0011BobITB0011Micke......
  • 深入MySQL索引,这篇千万不能错过
    大家好,我是【码老思】,索引是一个数据库绕不开的话题,今天和大家一起聊聊。1.索引索引是对数据库表中一列或多列的值进行排序的一种结构。MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。索引只是提高效率的一个因素,如果你的MySQL有大数据量......
  • hive数据清洗,导入mysql
    --用于清洗的表createtabledata1(`ip`stringcomment'城市',`date1`stringcomment'日期',`day`stringcomment'天数',`traffic`doublecomment'流量',`type`stringcomment'类型:视频video或文章art......
  • 4款.NET开源的Redis客户端驱动库
    前言今天给大家推荐4款.NET开源免费的Redis客户端驱动库(以下排名不分先后)。Redis是什么?Redis全称是REmoteDIctionaryService,即远程字典服务。Redis是一个使用C语言编写的、开源的(遵守BSD协议)、支持网络、可基于内存亦可持久化的日志型、Key-Value的NoSQL数据库。NewLife.......
  • sql注入(mysql的重要语句语法)
    查询当前数据库服务器所有数据库showdatabases;选中某个数据库use数据库名查询当前数据库所有的表showtables;查询某表所有数据select*fromt1;(whereid=2;)union合并查询2个特性:前面的查询语句和后面的查询语句结果互不干扰前面的查询语句的字段数量和后面......
  • mysql 物理备份xtrabackup
    1.优缺点优点:a.备份过程快速可靠b.支持增量备份c.备份过程不会打断正在执行的事务d.能够基于压缩等功能节约磁盘和空间e.自动实现备份验证f.还原速度快缺点:a.只能对innodb表进行增备,myisam表备份是全备b.对myisam表进行备份时要对全库加readlock,阻塞写操作,若备份在从库上进行会......
  • 遥遥领先!青否数字人直播系统5.0发布,支持真人接管实时驱动!
    副标题:口播视频批量制作+7*24小时直播全套解决方案。正文:青否数字人SaaS系统5.0正式发布,王炸更新!提供口播视频批量制作+7*24小时直播全套解决方案。同时直播间支持真人开麦/输入文字选择音色接管,实时驱动直播间数字人回复。7*24小时直播青否数字人客户端选择克隆好的数字人主播,克隆......
  • DDD(Domain-Driven Design,领域驱动设计)
    一、什么是DDDDDD指通过统一语言、业务抽象、领域划分和领域建模等一些列手段来控制软件复杂度的方法论,主要是用来指导如何解耦业务系统,划分业务模块,定义业务领域模型及其交互。 二、领域驱动开发过程不再以数据模型为起点,而是以领域模型为出发点,领域模型对应业务......