1. BST树:二叉搜索树(Binary Search Tree,简写BST),又称为二叉排序树,属于树的一种
通过二叉树将数据组织起来,树的每个节点都包含了健值 key、数据值 data、左子节点指针、右子节点指针。其中健值 key 是最核心的部分,它的值决定了树的组织形状;数据值 data 是该节点对应的数据,有些场景可以忽略,举个例子,key 为身份证号而 data 为人名,通过身份证号找人名;左子节点指针指向左子节点;右子节点指针指向右子节点。
1.2特点:
左右子树也分别是二叉搜索树。
左子树的所有节点 key 值都小于它的根节点的 key 值。
右子树的所有节点 key 值都大于他的根节点的 key 值。
二叉搜索树可以为一棵空树。
一般来说,树中的每个节点的 key 值都不相等,但根据需要也可以将相同的 key 值插入树中
2.AVL树:
AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写。AVL树属于树的一种,而且它也是一棵二叉搜索树,不同的是他通过一定机制能保证二叉搜索树的平衡,平衡的二叉搜索树的查询效率更高。
2.1特点:
AVL树是一棵二叉搜索树。
AVL树的左右子节点也是AVL树。
AVL树拥有二叉搜索树的所有基本特点。
每个节点的左右子节点的高度之差的绝对值最多为1,即平衡因子为范围为[-1,1]。
3.红黑(Red-black)树
是一种自平衡二叉查找树,1972年由Rudolf Bayer发明,它与AVL树类似,都在插入和删除操作时能通过旋转操作保持二叉查找树的平衡,以便能获得高效的查找性能。它可以在 O(logn) 时间内做查找,插入和删除等操作。红黑树是2-3-4树的一种等同,但有些红黑树设定只能左边是红树,这种情况就是2-3树的一种等同了。对于AVL树来说,红黑树牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树。
3.1特点:
节点是红色或黑色。
根节点是黑色。
每个叶节点(NIL节点)是黑色的。
每个红色节点的两个子节点都为黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
最长路径不超过最短路径的2倍
向红黑树中插入14的节点,由于15是黑色节点,所以没有破坏结构,不需要做任何的改变
如果向树中插入21的话,会破坏红黑树的规则,必须要调整,就是变色和旋转
为了符合红黑树的规则,会把节点红变黑或者黑变红,21,22是连续的红色,因此要将22红变黑
此时,不符合规则5,因此需要将25黑变红
此时还没有结束,因为25和27都出现了红色,因此需要将27变成黑色
左旋: 逆时针旋转,父节点被自己的右孩子取代,而自己成为自己的左孩子
右旋:顺时针旋转,父节点被做孩子取代,而自己成为自己的右孩子
4.缺点:
无论是二叉树还是红黑树,都会因为树的深度过深而造成io次数变多,影响数据读取的效率
B树的索引格式
4.1B树特点:
1、所有键值分布在整颗树中
2、搜索有可能在非叶子结点结束,在关键字全集内做一次查找,性能逼近二分查找
3、每个节点最多拥有m个子树
4、根节点至少有2个子树
5、分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)
6、所有叶子节点都在同一层、每个节点最多可以有m-1个key,并且以升序排列
InnoDB的特点:
读取数据的磁盘块是16kb,也就是4页,B树每个节点都有data,导致存放的页数变少,3次io只能查询16^3次方数据,也就是4096条数据,而在企业中是不满足业务要求的。B+树是对B书进行优化,让飞叶子节点中不存data,只存key值和指针。
实例图说明:
每个节点占用一个磁盘块,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为 16 和 34,P1 指针指向的子树的数据范围为小于 16,P2 指针指向的子树的数据范围为 16~34,P3 指针指向的子树的数据范围为大于 34。
查找关键字过程:
1、根据根节点找到磁盘块 1,读入内存。【磁盘 I/O 操作第 1 次】2、比较关键字 28 在区间(16,34),找到磁盘块 1 的指针 P2。3、根据 P2 指针找到磁盘块 3,读入内存。【磁盘 I/O 操作第 2 次】4、比较关键字 28 在区间(25,31),找到磁盘块 3 的指针 P2。5、根据 P2 指针找到磁盘块 8,读入内存。【磁盘 I/O 操作第 3 次】6、在磁盘块 8 中的关键字列表中找到关键字 28。
缺点:
1、每个节点都有key,同时也包含data,而每个页存储空间是有限的,如果data比较大的话会导致每个节点存储的key数量变小
2、当存储的数据量很大的时候会导致深度较大,增大查询时磁盘io次数,进而影响查询性能
5.mysql索引数据结构--B+Tree
B+Tree是在BTree的基础之上做的一种优化,变化如下:
1、B+Tree每个节点可以包含更多的节点,这个做的原因有两个,第一个原因是为了降低树的高度,第二个原因是将数据范围变为多个区间,区间越多,数据检索越快
2、非叶子节点存储key,叶子节点存储key和数据
3、叶子节点两两指针相互连接(符合磁盘的预读特性),顺序查询性能更高
注意:在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对 B+Tree 进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。
mysql InnoDB--B+Tree,叶子节点直接放置数据
注意:
1、InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点中存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id来作为主键
2、如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,叫做回表