一.Index Nested-LOOP JOIN

select * from t1 straight_join t2 on (t1.a=t2.a);
  • 从表t1中读入一行数据R
  • 从数据行R中,取出a字段到表t2中寻找
  • 取出t2中满足条件的行,跟R组成一行,作为结果集的一部分

join的执行流程

  1. 对驱动表t1做全表扫描,整个过程需要扫描100行
  2. 对每一行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条件作为结果集的一部分返回

Mysql 45讲学习笔记(三十四)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分段

小表