概述:

  • 两个表join连接时的算法。
  • 两个表关联时会有一个表作为驱动表,另一个表作为被驱动表
  • 普通join连接时,mysql一般会自己选择小表作为驱动表,也可以通过 straight_join固定,前面的是驱动表后面是被驱动表

    关联类型

    join

  • 普通join,不写join关键字也算

  • 强关联,两个表的条件同时满足才能查出数据。
  • mysql一般会自己选择小表作为驱动表
  • 可以通过straight_join关键字指定某个表只能作为被驱动表

    left join

  • 左连接,左边的是驱动表,连接的是被驱动表

  • 驱动表查到的数据一定列举出来,对应的被驱动表就算没有数据也无所谓

    right join

  • 右连接,跟左连接相反

连接算法

循环嵌套连接(NLJ)算法

  • Nested-Loop Join
  • 一般被驱动表关联字段有索引时会选择这种算法。
  • 大致过程:
    • 每次从第一张表(驱动表)读取一行数据,
    • 拿到关联字段,在被驱动表找到满足条件的行,
    • 取出两张表的结果合集
  • 必须要有索引的原因:

    • 没有索引时,如果去被驱动表找关联数据,此时只能进行全表扫描。
    • 驱动表每查一条数据,都全表扫描一次被驱动表,谁能忍???

      基于块的循环嵌套连接(BNL)算法

  • Block Nested-Loop Join

  • 一般被驱动表关联字段没有索引时会选择这种算法。
  • 大致过程:
    • 把驱动表数据读到 join_buffer 中(join_buffer默认256k,放不开就分批)
    • 扫描被驱动表全表,逐行取出与 join_buffer中数据对比
    • 得到两张表的结果合集
  • 此时必须要全表扫描了,就一批一批的来,尽量加快点速度。