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/30)∗2 + 2 ∗ 540 ∗ l o g 2 540 2*540*log_{2}540 2∗540∗log2540
3
4
1.全表扫描
2.索引扫描,较优
3.索引较优,直接查找2000 这个索引的左右两端即可,特别是元组中大多是2000 。
4.索引扫描,之后直接检查Salary是不是满足条件
5.因为Salary没有索引,直接是使用全表扫描是较优的
5
小结
(1)重点是对于select的查询优化,能先选的地方要先选,将这个表无论是做长度还是宽度的删减之后再进行连接操作
(2)当数据较大时,索引就显得十分重要。
最后分享一篇 为什么b+树适合索引:https://www.cnblogs.com/aspirant/p/9214485.html