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操作。这种方式扫描行数过多,会占用大量系统资源,不推荐