一.Index Nested-LOOP JOIN
select * from t1 straight_join t2 on (t1.a=t2.a);
- 从表t1中读入一行数据R
- 从数据行R中,取出a字段到表t2中寻找
- 取出t2中满足条件的行,跟R组成一行,作为结果集的一部分
join的执行流程
- 对驱动表t1做全表扫描,整个过程需要扫描100行
- 对每一行R,根据a字段去表t2查找,走的是树搜索过程
分表查询的流程
- 执行sleelct * from t1,查出表t1的所有数据
- 循环遍历,去查询表2
- 将结果返回成结果集
二.选择驱动表
join语句执行,驱动表是走全表扫描,被驱动表是走树搜索
- 小表做驱动表
- join语句性能比强拆多个单表执行SQL语句性能好
三.Simple Nested-Loop Join
select * from t1 straight_join t2 on (t1.a=t2.b);
表t2字段b上没有索引,因此去查t2的时候要全表扫描
笛卡尔积
四.Block Nested-Loop Join
- 将表t1数据读入线程内存 join_buffer 中
- 扫描表t2,将表t2中的每一行 取出来,跟join_buffer中数据比对,满足join条件作为结果集的一部分返回
五.能不能使用join语句
- Index Nested-Loop Join 算法,被驱动表上有索引,可以使用(可以用join)
- Block Nested-Loop Join 算法,扫描行数过多,占用大量的系统资源(不要用join)
六.使用join----选择小表做驱动表
两个表按各自条件过滤,过滤完成以后,计算join各自字段的总数量,数据量小的表叫小表,应该作为驱动表
算法 | 驱动表 |
Index Nested-Loop Join 算法 | 小表 |
Block Nested-Loop Join 算法------join_buffer足够大 | 一样 |
Block Nested-Loop Join 算法------join_buffer分段 | 小表 |