mysql驱动语句 mysql的连接驱动是什么( 四 )
![mysql驱动语句 mysql的连接驱动是什么](http://img.jiangsulong.com/221122/123931KV-17.jpg)
文章插图
基于上面的查询计划,我们可以看出B表是驱动表,A表是被驱动表 。接下来我们详细说明一下这个关联链接的具体执行过程是怎样的 。
获取B表中的第一行数据,然后从这行中,获取出该行的id的值 。拿着id的值去A表中去查找满足该id值的行,此时使用了A表中的主键索引 。找到后,把A表中的这个行和B表中的行拼接在一起,作为最后的结果集,返回给客户端 。这样就完成了B表中第一行数据和A表的inner join过程 。重复1、2、3步骤,直道把B表的所有行都遍历完成,就完成了此次的join过程 。以上的步骤就是Index Nested-Loop Join执行的过程 。注意:它在去被驱动表A中获取数据的时候,使用到了A表中的索引,并不是把A表中的所有数据都扫描一遍,再去和B表中的数据去匹配 。
Simple Nested-Loop Join
Simple Nested-Loop Join:简单嵌套循环连接 。
我们这次把上面的使用的SQL简单修改一下,改为如下的这种写法 。让其在关联的时候,不使用a.id = b.id的关联方式,而是使用a.code = b.code的关联方式 。注意:此时在两个表上面的code字段都没有索引 。
explain select * from A as a inner join B as b on a.code = b.code;
执行计划如下,从中可以看出B表示驱动表,A表示被驱动表 。
![mysql驱动语句 mysql的连接驱动是什么](http://img.jiangsulong.com/221122/1239314D4-15.jpg)
文章插图
此时在去A表被驱动表中查找数据的时候,就不能通过A表中的索引来获取数据了 。那么就需要把A表中所有的数据都扫描一遍,然后再和B表中的id值进行匹配 。这样每处理B表中的一行,A表中的数据都要全部扫描一次 。这样的效率比前面我们提到的Index Nested-Loop Join慢了很多 。
但是,MySQL在这种情况下并没有采用这种慢的方式,而是采用了下面我们将要说的Block Nexted-Loop Join的关联方式 。这就是为什么我们在上面的查询计划中没有看到Simple Nested-Loop Join的原因 。
Block Nexted-Loop Join
Block Nexted-Loop Join:基于块的嵌套循环连接 。
因为在被驱动表A找那个没有索引,所以MySQL此时才去的关联方式是基于块的嵌套循环连接 。执行计划如下所示:
此时的关联过程是这样的:
首选会把驱动表B的数据全部加载到join buffer中,因为我们的select语句包含了B表的所有列,所以把B表全部列和行都加载到join buffer中 。扫描被驱动包A,把表中的行依次取出来和join buffer中的驱动表B中的数据进行匹配查询 。匹配上则保留为左后的结果,否则丢弃 。在上面的过程中,需要把驱动表中的数据全部加载到join buffer中 。但如果驱动表B中的数据特别多,而我们的join buffer特比较小,join buffer的大小不能全部装下驱动表B中的数据时,会怎么样呢?
MySQL会把驱动表B中的数据,分批次的放入到join buffer中 。每次在放置新的数据进入join buffer之前,会清空上一次的数据 。并且,每次在放入新的数据后,都会再次把被驱动表A中的数据扫描一遍和join buffer中 数据进行关联匹配 。
此时,如果适当的增加join buffer的大小,则可以减少分批次放入的次数,也就可以减少对被驱动表扫描的次数 。所以在某些情况下,适当的增加join_buffer_size的值,可以提供join查询的效率 。
综上所述:在mysql的join连接中,需要遵循如下两点:
以小表驱动大表 。在left join和right join的时候,要注意小表要放在SQL语句的正确位置上 。给被驱动表建立索引 。
【mysql驱动语句 mysql的连接驱动是什么】Tags:
推荐阅读
- 如何使用电脑自带的BitLocker驱动器加密功能
- 有哪些正能量的经典语句?
- 分享一个sql语句生成向导的源代码
- MySql中json类型数据的查询以及在MyBatis-Plus中的使用
- mysql怎么更改密码? mysql更改密码
- 正在扫描和修复驱动器c已完成100%几个小时 电脑一直显示正在扫描和修复驱动器,已完成100%
- mysql官网下载教程
- 15句经典最励志英语句子 经典励志英语句子
- 关于樱花的浪漫语句有哪些?
- 对于 Display 框架,我需要了解 KMS api 吗?| Linux 驱动