概述:
- 两个表join连接时的算法。
- 两个表关联时会有一个表作为驱动表,另一个表作为被驱动表
普通join连接时,mysql一般会自己选择小表作为驱动表,也可以通过 straight_join固定,前面的是驱动表后面是被驱动表
关联类型
join
普通join,不写join关键字也算
- 强关联,两个表的条件同时满足才能查出数据。
- mysql一般会自己选择小表作为驱动表
可以通过
straight_join关键字指定某个表只能作为被驱动表left join
左连接,左边的是驱动表,连接的是被驱动表
驱动表查到的数据一定列举出来,对应的被驱动表就算没有数据也无所谓
right join
右连接,跟左连接相反
连接算法
循环嵌套连接(NLJ)算法
- Nested-Loop Join
- 一般被驱动表关联字段有索引时会选择这种算法。
- 大致过程:
- 每次从第一张表(驱动表)读取一行数据,
- 拿到关联字段,在被驱动表找到满足条件的行,
- 取出两张表的结果合集
必须要有索引的原因:
Block Nested-Loop Join
- 一般被驱动表关联字段没有索引时会选择这种算法。
- 大致过程:
- 把驱动表数据读到 join_buffer 中(join_buffer默认256k,放不开就分批)
- 扫描被驱动表全表,逐行取出与 join_buffer中数据对比
- 得到两张表的结果合集
- 此时必须要全表扫描了,就一批一批的来,尽量加快点速度。
