多表连接原理
1.内连接与外连接
⼀般情况下,我们都把只涉及单表的过滤条件放到WHERE⼦句中,把涉及两表的过滤条件都放到ON⼦句中,我们也⼀般把放到ON⼦句中的过滤条件也称之为连 接条件。
- 对于内连接的两个表,驱动表中的记录在被驱动表中找不到匹配的记录,该记录不会加⼊到最后的结果集
- 对于外连接的两个表,驱动表中的记录即使在被驱动表中没有匹配的记录,也仍然需要加⼊到结果集。
- 在MySQL中,根据选取驱动表的不同,外连接仍然可以细分为2种:
- 左外连接 选取左侧的表为驱动表。
- 右外连接 选取右侧的表为驱动表。
- 在MySQL中,根据选取驱动表的不同,外连接仍然可以细分为2种:
2.连接的原理
(1)嵌套循环连接算法
算法思想:主表只要访问一次,而从表会被访问多次。具体访问几遍取决于对主表执行单表查询后的结果集中的记录条数。
示例:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JJ71XJdq-1686638525208)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220830115212859.png)]
对从表建立索引加快访问速度:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d1IlSdJC-1686638525209)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220830115705018.png)]
(2)基于块的嵌套循环连接算法
join buffer:存放多条主表查询数据。尽量减少访问从表的次数
通过启动参数或者系统变量join_buffer_size进行配置,默认大小为262144字节(也就是256KB),最小可以设置为128字节。
144字节(也就是256KB),最小可以设置为128字节。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cWOsVB6d-1686638525210)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220830135758296.png)]