Join 连表操作

本文详细介绍了MySQL中的两种连表操作:NLJ(Index Nested-Loop Join)和BNL(Block Nested-Loop Join)。NLJ在被驱动表有索引时效率较高,可通过MRR优化,而BNL适用于无索引的情况,可能导致大量IO和比较操作。小表驱动大表的原则是根据过滤后的数据量确定哪个表为驱动表,以提高查询效率。MySQL 8.0引入的Hash Join为BNL提供了一种优化方案。
摘要由CSDN通过智能技术生成

参考文章

https://time.geekbang.org/column/article/79700

https://time.geekbang.org/column/article/80147

NLJ(Index Nested-Loop Join)

对于被驱动表有索引的情况

遍历驱动表,每读出一条驱动表上的数据,都会去被驱动表的索引树上获取满足条件的数据,组成一行作为结果集的一部分。然后重复上述步骤

NLJ优化使用MRR的时候,就会先讲驱动表的数据部分存放到join_buffer中,然后一次性传入一批的关联数据到被驱动表中,加快查询速度

假如驱动表的数据过多,也会有分段放入join_buffer的情况(BKA算法)

BNL(Block Nested-Loop Join)

对于被驱动表没有可用索引的情况

对驱动表做遍历,将数据放入join buffer,然后对第二张表做遍历,在内存中做匹配放入join buffer中

假如驱动表太大,join buffer不够的情况,会分块获取被驱动表的数据,然后逐块去做上述的步骤(被驱动表被扫描的次数增加)

这种情况就不适合使用join去做连表查询了<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值