Mysql梳理三_left join和join的执行原理及效率

遇到一个情况,left join 两表时,sending data步骤比join两表时慢了120倍(left join 6s,join 0.5秒)。想研究下为什么,以下是爬到的资料。

join 主要有3种方式

  1. Nested loop —嵌套循环:栗子中tableA为10x1,tableB为10x1
  • simple nested-loop join:从A中依次取出每个值,从B中从上往下依次匹配,并将其返回。执行次数为10x10.
  • index nested-loop join:利用索引进行匹配,index要求非驱动表上具有索引,可以通过索引来减少比较。A表会根据关联字段的索引进行查找在索引上找到符合的值再进行回表查询。
  • block nested-loop join:和第一种相比,区别是会把驱动表中left join涉及到的所有列(不止是用来on的列,还有select部分的列)先取出来放到一个缓存区,然后再去和非驱动表进行匹配。
  1. hash join
  2. merge join

其他概念:

  1. 驱动表-主表,left join时,左表就是驱动表。

对比了执行计划以及状态变量的变化,效率主要消耗在sending data步骤

  1. 由于在on列都建立了idx,因此可以推测,join执行了index nested-loop join,而left join执行了block nested-loop join,因为使用了buffer-pool;
  2. 因为left join 需要从A表取出select以及on的字段存放到缓存区再进行on比较,因此增大了数据读取到消耗。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值