简介
1、必读https://www.playscala.cn/article/view?_id=10-5d318144eeab561d2405e2de
https://www.cnblogs.com/vincently/p/4526560.html
b树
1、每个节点最多拥有m个子树
2、根节点至少有2个子树
3、分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)
4、所有叶子节点都在同一层
5、每个节点最多可以有m-1个key,并且以升序排列
B+树
1、有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点;
2、叶子节点中包含了全部元素的信息,按照关键字的大小从左到右排序;
3、中间节点的元素同时存在于子节点中,在子节点元素中是最大。
B+树为什么更适合做索引
1、B+的非叶子节点只包含索引不包含数据,所以每个数据块可以存储更多的数据,B+树比B树更矮胖(磁盘io次数少)
2、查询稳定(每次都会查到叶子节点)
3、范围查询简便(叶子节点链表遍历),B树需要进行中序遍历比较复杂
磁盘和B+树有什么关系
1、索引已B+树的数据结构存储在磁盘中,磁盘每次以磁盘块为单位进行读取
2、InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小(默认16KB)
3、预读,每一次IO时,不仅仅把当前磁盘地址的数据加载到内存,同时也把相邻数据也加载到内存缓冲区中。(因为局部预读原理说明:当访问一个地址数据的时候,与其相邻的数据很快也会被访问到。)每次磁盘IO读取的数据我们称之为一页(page),这也就意味着读取一页内数据的时候,实际上发生了一次磁盘IO。
4、B+Tree的高度一般都在2~4层。mysql的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要1~3次磁盘I/O操作
红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。
红黑树的性质
- 每个结点不是红色就是黑色
- 根节点是黑色的
- 如果一个节点是红色的,则它的两个孩子结点是黑色的
- 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点
- 每个叶子结点都是黑色的(此处的叶子结点指的是空结点)
参考
2-3树
https://www.cnblogs.com/atai/p/9606757.html
https://mp.weixin.qq.com/s/rDCEFzoKHIjyHfI_bsz5Rw
B树
自平衡、矮胖节点内元素多些没有关系,因为是内存操作
b+树
https://www.jianshu.com/p/1f2560f0e87fb+树