Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化( 三 )

,如果a是索引那么将使用单表查询的range访问方法

  • 涉及两表的条件
    比如select * from a , b where a.k1 = b.k2 and a.k3>b.k4 , 这里涉及的条件便是a.k1 = b.k2 and a.k3>b.k4 , 对于这种擦好像执行过程如下
    1. 首先确定第一个需要查询的表,称为驱动表
      mysql会选择代价最小的访问方法对驱动表进行查询
    2. 1中的驱动表获取到的每一条记录 , 都需要去另外一张表中查询匹配的记录
      比如在a作为驱动表获取到了a.k1=1,a.k3=2 那么接下来需要去表b中查询满足1=b.k2 and 2>b.k4的记录(并不是将在驱动表中获取到的记录缓存起来 , 再一起到被驱动表中进行查询 , 而是每在驱动表中获取到一条记录都会到被驱动表中查询满足的数据)
  • 3.内连接和外连接
    • 对于内连接的两个表 , 如果驱动表中的记录在被驱动表中找不到匹配的记录 , 那么该记录不会加入到最后的结果集 。
      select * from user_detail d ,user u where u.id = d.id查询结果如下
      Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化

      文章插图
      user_detail 中具备非常多的记录 , 但是和user 中id匹配的记录只有id=3 , 这里也只能查出一条记录
    • 对于外连接的表 , 即使驱动表中的记录在被驱动表中找不到匹配的记录 , 那么也会加入到结果集中
      select * from user_detail d left join user u onu.id = d.id查询结果如下
      Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化

      文章插图
      即使在onu.id = d.id的限制下 , 只有id=3满足 , 其他id不满足 , 也会将其他记录加入到结果集 , 被驱动的字段使用null填充
    4.外连接的分类外连接分为左外连接 即左连接 , 右外连接 即右连接 , 二者的区别在于左连接是左边的表作为驱动表 , 右连接使用右边的表作为驱动表 。
    5.where 和 on在外连接中存在whereon两种过滤条件 。
    1. where
      无论是内连接 , 还是外连接 , 只要不符合where条件的记录都不会加入到最后的结果集中
    2. on
      对于外连接 , 如果无法在被驱动表中找到符合on的记录 , 驱动表的记录还是会加入结果集中 , 对应的被驱动表的各个字段使用null填充 。
      select * from user_detail d left join user u onu.id = d.id where d.detail like '%Dz%'查询结果如下
      Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化

      文章插图
      最后只有满足d.detail like '%Dz%'的记录才会加入到结果集 。
      对于下面的两个内连接查询语句
      select * from user_detail d inner joinuser u on u.id = d.id and d.detail like '%Dz%'select * from user_detail d inner joinuser u on u.id = d.id where d.detail like '%Dz%'查询结果如下:
      Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化

      文章插图
    ?说明在内连接中 on 等同于where
    6.连接查询的原理上面我们复习了内连接外连接的基础知识 , 下面我们开始学习下mysql是如何进行连接查询的
    6.1嵌套循环连接