深挖:MySQL-Join执行过程详解

推荐一篇好文章:Mysql - JOIN 详解

该文章总结如下:

1.JOIN语句的执行顺序

SELECT 
 FROM 
    JOIN 
     ON 
       WHERE 

它的执行顺序如下(SQL语句里第一个被执行的总是FROM子句):

  • FROM:对左右两张表执行笛卡尔积,产生第一张表vt1。行数为n*m(n为左表的行数,m为右表的行数
  • ON:根据ON的条件逐行筛选vt1,将结果插入vt2中
  • JOIN:添加外部行,如果指定了LEFT JOIN(LEFT OUTER JOIN),则先遍历一遍左表的每一行,其中不在vt2的行会被插入到vt2,该行的剩余字段将被填充为NULL,形成vt3;如果指定了RIGHT JOIN也是同理。但如果指定的是INNER JOIN,则不会添加外部行,上述插入过程被忽略,vt2=vt3(所以INNER JOIN的过滤条件放在ON或WHERE里 执行结果是没有区别的,下文会细说)
  • WHERE:对vt3进行条件过滤,满足条件的行被输出到vt4
  • SELECT:取出vt4的指定字段到vt5
第一步:执行FROM子句对两张表进行笛卡尔积操作
第二步:执行ON子句过滤掉不满足条件的行
第三步:JOIN 添加外部行
第四步:WHERE条件过滤
第五步:SELECT

2.INNER/LEFT/RIGHT的区别

left join 和 right join没区别

RIGHT JOIN works analogously to LEFT JOIN. To keep code portable across databases, it is recommended that you use LEFT JOIN instead of RIGHT JOIN.

inner join和它们的区别:inner join没有第三步

3.ON和WHERE的区别

ON先触发,where后触发

若为inner join,则无区别

4.驱动表

mysql中指定了连接条件时,满足查询条件的记录行数少的表为驱动表;如未指定查询条件,则扫描行数少的为驱动表。mysql优化器就是这么粗暴以小表驱动大表的方式来决定执行顺序的。

5.left join优化建议

  • 条件中尽量能够过滤一些行将驱动表变得小一点,用小表去驱动大表
  • 右表的条件列一定要加上索引(主键、唯一索引、前缀索引等),最好能够使type达到range及以上(ref,eq_ref,const,system)
  • 最好不要用left join

你可能感兴趣的:(深挖:MySQL-Join执行过程详解)