第九章关系查询处理和查询优化

B+树

参考文档https://blog.csdn.net/qq_26222859/article/details/80631121

m阶B树:
1.根结点至少有两个子节点。

2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.所有的叶子结点都位于同一层。

5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

m 阶B+树
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

优点
1.单一节点存储更多的元素,使得查询的IO次数更少。

2.所有查询都要查找到叶子节点,查询性能稳定。

3.所有叶子节点形成有序链表,便于范围查询。

在这里插入图片描述
关于 B树的代码实现强烈推荐一篇文章https://blog.csdn.net/geek_jerome/article/details/78895289
他写了500多行

在这里插入图片描述
引入知识点 :
在这里插入图片描述
第三个中的Br以及Bs分别代表关系r,s 中的所占有的块数,k-1 指的是在内存中分配给外表的块数,也可能是直接给出来的。Ns ,Nr 自然就是表示元组数目。

2
(1) 读入磁盘 : 20000/40 =500
(2) 索引需要读三次磁盘,共有4次。
(3) 20000/40+20000/40* 1200/30 +1200/10,其中 读磁盘需要20000/40+20000/40 *1200/30 次,假设连接后一块含有10个数据 ,要写入1200/10
(4) 有序:根据上面的公式 20000/40 +1200/10 ,写入的话需要写入1200/10 次数,假设连接之后包含10个元组,即Mrs =10
无序 : ( 20000 / 40 + 1200 / 30 ) ∗ 2 (20000/40 +1200/30 )*2 (20000/40+1200/302 + 2 ∗ 540 ∗ l o g 2 540 2*540*log_{2}540 2540log2540

3
在这里插入图片描述
在这里插入图片描述

4

1.全表扫描
2.索引扫描,较优
3.索引较优,直接查找2000 这个索引的左右两端即可,特别是元组中大多是2000 。
4.索引扫描,之后直接检查Salary是不是满足条件
5.因为Salary没有索引,直接是使用全表扫描是较优的

5

在这里插入图片描述
在这里插入图片描述
小结
(1)重点是对于select的查询优化,能先选的地方要先选,将这个表无论是做长度还是宽度的删减之后再进行连接操作
(2)当数据较大时,索引就显得十分重要。

最后分享一篇 为什么b+树适合索引:https://www.cnblogs.com/aspirant/p/9214485.html

猜你喜欢

转载自blog.csdn.net/weixin_44724691/article/details/105795804