MySQL中 join or not join

本文探讨了MySQL中JOIN操作的不同类型,如NLJ和BNL,以及如何通过优化驱动表选择、利用索引和Batched Key Access算法提高JOIN性能。强调了小表作为驱动表的重要性,并提出在特定情况下通过临时表和业务端手动实现JOIN优化。
摘要由CSDN通过智能技术生成

1、驱动表和被驱动表

SQL语句:select * from t1 straight_join t2 on (t1.a=t2.a),其中t1、t2结构相同,两表皆有主键id、字段a和字段b。执行过程中首先会从表t1中取一行R,从R中取得字段a再到表t2中取查找,取出满足条件的行,跟R组成一行,作为结果集返回。因此,表t1称为驱动表,表t2称为被驱动表

2、Index Nested-Loop Join

以1中SQL语句为例,如果t2.a上建了索引,那就是Index Nested-Loop Join(简称NLJ),因为在表t2查找满足条件的a时,可以使用索引快速定位。

假设驱动表的行数为N,被驱动表的行数为M,对于驱动表中的每一行,都要去被驱动表中先在a的索引树上查找(复杂度近似logM),再去主键索引上查找(复杂度近似logM),因此整个语句执行下来,复杂度近似为N+N2logM。很明显,N对复杂度的影响较大,因此选择驱动表的时候,要选择小表作驱动表(这里的前提是被驱动表可以用上索引)。

3、Block Nested-Loop Join

当被驱动表不能用上索引的时候,MySQL将使用这种方式进行join操作。这种方式扫描行数过多,会占用大量系统资源,不推荐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值