SQL语句的JOIN原理:

数据库中的join操作,实际上是对一个表和另一个表的关联,而很多错误理解为,先把这两个表来一个笛卡尔积,然后扔到内存,用where和having条件来慢慢筛选,其实数据库没那么笨的,那样会占用大量的内存,而且效率不高,比如,我们只需要的一个表的一些行和另一个表的一些行,如果全表都做笛卡尔积,这开销也太大了,真正的做法是,根据在每一个表上的条件,遍历一个表的同时,遍历其他表,找到满足最后的条件后,就发送到客户端,直到最后的数据全部查完,叫做嵌套循环查询

LEFT JOIN 和 RIGHT JOIN优化

在MySQL中,实现如 A LEFT JOIN B join_condition 如下:

1、表B依赖赖与表A及所有A依赖的表

2、表A依赖于所有的表,除了LEFT JOIN 的表(B)

3、join_condition决定了怎样来读取表B,where条件对B是没有用的

4、标准的where会和LEFT JOIN联合优化

5、如果在A中的一行满足where和having条件,B中没有,会被填充null

RIGHT JOIN 与LEFT JOIN类似,这个位置是可以互换的

LEFT JOIN 与 正常JOIN之间的转换原则:

  • 当where条件对于生成的null行总返回false时,可以直接转化为正常的join如:

    1
    SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
  • 将转换为:

    1
    SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

注:因为设置了条件t2.column2 = 5,那么对于所有的生成的t2为null的行都是不成立的。这样的优化将非常快速,因为这样相当于把外连接转换为等值连接,少了很多行的扫描和判断。