遇到一个情况,left join 两表时,sending data步骤比join两表时慢了120倍(left join 6s,join 0.5秒)。想研究下为什么,以下是爬到的资料。
join 主要有3种方式
- 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部分的列)先取出来放到一个缓存区,然后再去和非驱动表进行匹配。
- hash join
- merge join
其他概念:
- 驱动表-主表,left join时,左表就是驱动表。
对比了执行计划以及状态变量的变化,效率主要消耗在sending data步骤
- 由于在on列都建立了idx,因此可以推测,join执行了index nested-loop join,而left join执行了block nested-loop join,因为使用了buffer-pool;
- 因为left join 需要从A表取出select以及on的字段存放到缓存区再进行on比较,因此增大了数据读取到消耗。