一:B树概念
B树也称B-树,英文名称Balance Tree,所以它是一颗平衡树,平衡因子为0,所有叶子节点位于同一层。同时是多路查找树。
特点:
每个节点可以有多个数据元素;
平衡树(平衡因子为0,所有叶子节点都位于同一层);
查找树;
所有节点的孩子节点数(不是数据元素个数)的最大值称为B树的阶,一棵m阶B树称为m叉树。
下面我们来看看B树的定义。
每个节点都存有索引和数据,也就是对应的key和value。索引是指向子节点的指针,数据是关键字;
每个节点最多有m-1个关键字(可以存有的键值对),即每个节点至多含有m棵子树;
若根节点不是终端节点,则至少有两棵子树,即最少可以只有1个关键字;
除根节点外的所有非叶节点至少有上限值(m/2)棵子树,即上限值(m/2)-1个关键字;
每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。
所以,根节点的关键字数量范围:1 <= k <= m-1,除根节点外的所有非叶节点的关键字数量范围:上限值(m/2)-1 <= k <= m-1。
二:B+树概述
B+树其实和B树是非常相似的,我们首先看看相同点。
根节点至少一个元素;
除根节点外的所有非叶节点元素范围:上限值(m/2)-1 <= k <= m-1。
不同点。
B+树有两种类型的节点:内部节点(也称索引节点)和叶子节点。内部节点就是非叶子节点,内部节点不存储数据,只存储索引,数据都存储在叶子节点;
内部节点中的key都按照从小到大的顺序排列,对于内部节点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。叶子节点中的记录也按照key的大小排列;
每个叶子节点都存有相邻叶子节点的指针,叶子节点本身依关键字的大小自小而大顺序链接;
父节点存有右孩子的第一个元素的索引。
三:B树、B+树、红黑树总结
B+树相对于B树、红黑树有一些自己的优势,可以归结为下面几点。
单一节点存储的元素更多,使得查询的IO次数更少,所以也就使得它更适合做为数据库MySQL的底层数据结构了;
红黑树等查找树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B+树 作为索引结构,这是因为使用 B+ 树访问磁盘数据有更高的性能;
相比较于红黑树,B+树有更低的树高,平衡树的树高 O(h)=O(logdN),其中 d 为每个节点的出度。红黑树的出度为 2,而 B+ Tree 的出度一般都非常大,所以红黑树的树高 h 很明显比 B+ Tree 大非常多;
所有的查询都要查找到叶子节点,查询性能是稳定的,而B树,每个节点都可以查找到数据,所以不稳定;
所有的叶子节点形成了一个有序链表,更加便于查找。因为 B+ Tree 的有序性,所以除了用于查找,还可以用于排序和分组。