外连接消除、嵌套连接消除与连接消除_外连接

                                                                                           图:什么是外连接

  A表和B表共同的部分,即为内连接操作

  

外连接消除、嵌套连接消除与连接消除_外连接_02

                                                                     图:分别执行了内连接和外连接

             

       

外连接消除、嵌套连接消除与连接消除_左外连接_03

                                                                       图:内连接和左外连接的执行结果

外连接消除、嵌套连接消除与连接消除_mysql_04

                                                     图:外连接的连接类型

   

外连接消除、嵌套连接消除与连接消除_左外连接_05

                                  图:右外连接与全外连接

  

外连接消除、嵌套连接消除与连接消除_mysql_06

                         图:为什么做外连接的消除,把外连接变为内连接

     

外连接消除、嵌套连接消除与连接消除_左外连接_07

                               图:外连接消除的意义

   

外连接消除、嵌套连接消除与连接消除_左外连接_08

                             图:两个实例

      如上图所示,t1 inner join t2 on P1(T1, T2) inner join t3 on P2(T2, T3),对于t1中的每条记录,遍历t2中的每条记录,然后根据t2中的记录,遍历

   t3中的记录,找到满足条件的元组,len(t1)*len(t2)*len(t3)

   上图右边部分是t1、t2和t3左外连接操作的执行形式,可以看出比内连接多做了判断的操作,多占用了cpu资源

  

外连接消除、嵌套连接消除与连接消除_外连接_09

                       图:外连接消除的条件

        

外连接消除、嵌套连接消除与连接消除_左外连接_10

             

外连接消除、嵌套连接消除与连接消除_左外连接_11

           

外连接消除、嵌套连接消除与连接消除_左外连接_12

               

外连接消除、嵌套连接消除与连接消除_内连接_13

               where条件可以保证从结果中排除外连接右侧(右表)生成的值为NULL的行,因为where条件中的t_1_id=t_2_id保证了

              t_2_id不可能是空的。

           

外连接消除、嵌套连接消除与连接消除_内连接_14

                   

外连接消除、嵌套连接消除与连接消除_内连接_15

                          

外连接消除、嵌套连接消除与连接消除_mysql_16

                             

外连接消除、嵌套连接消除与连接消除_外连接_17

                               

外连接消除、嵌套连接消除与连接消除_mysql_18

                               

外连接消除、嵌套连接消除与连接消除_外连接_19

         

外连接消除、嵌套连接消除与连接消除_内连接_20

               

外连接消除、嵌套连接消除与连接消除_左外连接_21

                  从上图中可以看到左外连接没有被消除掉,转换为内连接

                  

外连接消除、嵌套连接消除与连接消除_左外连接_22

                        

外连接消除、嵌套连接消除与连接消除_mysql_23

                                    图:左外连接被消除掉了,转换为了内连接

                      因为t_2_id>0表明t2表是不会出现空行的,即内表产生的结果不会产生空行

外连接消除、嵌套连接消除与连接消除_mysql_24

  

外连接消除、嵌套连接消除与连接消除_左外连接_25

      

外连接消除、嵌套连接消除与连接消除_外连接_26

      

外连接消除、嵌套连接消除与连接消除_外连接_27

         

外连接消除、嵌套连接消除与连接消除_mysql_28

        

外连接消除、嵌套连接消除与连接消除_mysql_29

          

外连接消除、嵌套连接消除与连接消除_mysql_30

               

外连接消除、嵌套连接消除与连接消除_左外连接_31

                  

外连接消除、嵌套连接消除与连接消除_mysql_32

                    

外连接消除、嵌套连接消除与连接消除_左外连接_33

                     

外连接消除、嵌套连接消除与连接消除_mysql_34

                      

外连接消除、嵌套连接消除与连接消除_mysql_35

                      

外连接消除、嵌套连接消除与连接消除_内连接_36

                     

                    

外连接消除、嵌套连接消除与连接消除_外连接_37

                      

外连接消除、嵌套连接消除与连接消除_内连接_38

                    目标列是一样的,而where条件是不同的,可以把第一条转换为第二条或者第三条语句来手工调优

                   

          

外连接消除、嵌套连接消除与连接消除_外连接_39

                     

  

外连接消除、嵌套连接消除与连接消除_内连接_40

                

外连接消除、嵌套连接消除与连接消除_mysql_41

          

外连接消除、嵌套连接消除与连接消除_左外连接_42

            

外连接消除、嵌套连接消除与连接消除_mysql_43

                

外连接消除、嵌套连接消除与连接消除_左外连接_44

                

外连接消除、嵌套连接消除与连接消除_左外连接_45

     首先把b和c优先连接的语义去除了,然后就是改变了括号的连接顺序

           

外连接消除、嵌套连接消除与连接消除_内连接_46