看完这章你会学习到以下内容:
1. 三种关联分别是什么?
2. 什么时候那个适合用哪个?(总结)
一共有三种关联机制:
Nest Loop 嵌套循环(大小表)
Sort Merge 排序合并(添加索引 + 两张大表)
Hash Join 哈希(内联)
嵌套循环
对上图进行简单的解释,在进行嵌套循环的时候,通常情况是(大表 + 小表)的形式,并且会以小表作为内表,因为小表可以常驻内存,这样当进行磁盘 IO 的时候,只有大表会产生开销;反之,如果因为大表过大,则大表不能常驻内存,内外表的数据均存在与磁盘中,这样,进行磁盘 IO 开销是非常“可观”的
解释了,谁做内外表的问题后,看下嵌套关联的操作过程:
1. 取得要操作的表空间
2. 对表空间的记录进行排序
3. 通过嵌套循环进行赛选(如果是双表,可能是两个 for 嵌套)
4. 获得需求的记录
归并关联
对与归并关联,有着很好的时间复杂度(如果两个表中的元素已经排序,如果未排序,时间开销可能为 XlogX + YlogY + X + Y)。
那么,如何对排序好的元素进行关联呢:
1. 首先每张表,会有一个 指向头元素的指针
2. 两个指针,进行比较,如果相同,则提出该元素
3. 比较后续元素,谁小谁先向下移动
4. 如此,一直到各自表的结尾
Hash 关联(散列关联)
散列关联,则是对表进行散列后(不可超过内存的大小),另外一张表进行匹配;通常来说被散列的依旧是小表,匹配的过程需要匹配全部元素。
以上三种,根据以上三种关联方式,可以大致了解到一定的 sql 语句的原理以及调优机制,即为什么有的时候会加索引、或者不加、或者改变内外表的关联。
总结:
版权声明:本文为 CSDN 博主「Anger_Coder」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:Study-Hard- 数据库连接及实现内部原理(下)_Anger_Coder 的专栏 -CSDN 博客