为了提高查找效率,采用了树这种逻辑结构。
科学家先后发明了二叉查找树、二叉排序树、平衡二叉树(AVLTree)、平衡多路查找树(B-树)、B+树
B+树由这些数据结构演化而来,是目前最高效的查找数据结构。
下面说一下这些树:
二叉查找树:
二叉查找树中序遍历有序!中序遍历是左->中->右。
但是二叉查找树可以任意构造,因为只要满足中序序列有序,它就是二叉查找树,但是奇形怪状的二叉查找树查找效率不行,所以加了一些约束:平衡二叉树诞生了!
平衡二叉树:
平衡二叉树也是二叉查找树,但是有个条件:平衡二叉树必须是任何一个节点的左右子树最大高度差为1,这才是平衡的。
向AVL树中插入或删除一个节点,这可能会导致AVL失去平衡,AVL失去平衡有四种姿态:
LL:根节点的左孩子的左孩子还有非空节点,
RR:根节点的右孩子的右孩子还有非空节点,
LR:根节点的左孩子的右孩子还有非空节点,
RL:根节点的右孩子的左孩子还有非空节点,
如果增删节点失去平衡,需要旋转使AVL恢复平衡,四种不平衡姿态对应四种不同旋转方式:
LL的旋转:
RR的旋转:
LR的旋转:
RL的旋转:
平衡多路查找树(B-树):
为磁盘等外存设备设计的一种平衡查找树。
先了解一下磁盘相关知识:
系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。
InnoDB是MySQL中的一种存储引擎,存储引擎是数据库最核心的组件。
InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,MySQL查看页的大小:show variables like 'innodb_page_size'
一个磁盘块的存储空间 < 页的大小,因此InnoDB每次申请磁盘空间时都会是若干地址连续磁盘块来达到页的大小16KB。
InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条数据都能有助于定位数据记录的位置,这将会减少磁盘I/O次数,提高查询效率。
B-Tree结构的数据可以让系统高效的找到数据所在的磁盘块,
为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。
一棵m阶B-树的特性:
1.每个节点最多有m个孩子,B树是多叉树
2.除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子 m/2往大取整
3.若根节点不是叶子节点,则至少有2个孩子
4.所有叶子节点都在同一层,且不包含其它关键字信息
5.先写到这,先缓缓...,下次接着写^-^
参考:
https://blog.csdn.net/ifollowrivers/article/details/73614549