1、B树(B-tree)
- B 树(B-tree)是一种自平衡的树,能够保持数据有序。一个单节点可以存储多个键值对。
- 这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。
- B 树,概括来说是一个一般化的二叉查找树(binary search tree),可以拥有多于 2 个子节点。
1.1 与自平衡二叉查找树不同
- 平衡二叉树每个节点最多有 2 子节点,B 树可以有更多的子节点。
- B 树为系统大块数据的读写操作做了优化。B 树减少定位记录时所经历的中间过程,从而加快存取速度。
1.2 用处
B 树这种数据结构可以用来描述外部存储。这种数据结构常被应用在数据库和文件系统的实现上
2、B+
- B+树是一种树数据结构。通常用于数据库和操作系统的文件系统中。
- B+树的特点:是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。
- B+树元素自底向上插入,这与二叉树恰好相反。
- B+树的非叶子节点上不存数据的,只存储键。B + 树之所以这么做的意义在于:树一个节点就是一个页,而数据库中页的大小是固定的,innodb 存储引擎默认一页为 16kb,所以在页大小固定的前提下,能往一个页中放入更多的节点;相应的树的阶数就会更大,那么树的高度必然更矮更胖;如此一来我们查找数据进行磁盘io次数又会再次减少,数据查询的效率也会更快。
- B+树的叶子结点以上各层只存键值,作为索引使用。
2.1 一个 m 阶的 B+树
- 每个几点最多有 m 个子节点
- 除根节点外,每个节点最少有 m/2 个子节点,根节点最少有 2 子节点
- 有 k 个子节点的节点必然有 k 个键。
B+ 树索引就是 innodb 中 B+ 树索引真正的实现方式,确切的说应该是聚集索引。
在 innodb 中,我们通过数据页之间通过双向链表连接以及叶子节点中数据之间通过单向链表连接的方式可以找到表中所有的数据。
3、B树 和 B+树区别
- B+ 树非叶子节点 non-leaf node 上是不存储数据的,仅存储键,而 B 树的非叶子节点中不仅存储键,也会存储数据。
- B+ 树的阶数是大于等每个节点的键的数量的。B 树与之相比高度会大于等于 B+ 树,所以查找效率不会比 B+ 树更好。
- 如我们的 B+ 树中每个节点可以存储 3 个键,3 层 B+ 树可以存储 3*3*3=27 个数据。
- 如果我们的 B+ 树一个节点可以存储1000个键值,那么 3 层 B+ 树可以存储 1000*1000*1000=10亿个数据。
- 而一般根节点是常驻内存的,所以一般我们查找出 10 亿数据,只需要 2 次磁盘 IO。
- B+ 树索引的所有数据均存储在叶子节点 leaf node ,而且数据是按照顺序排列的。
- B+ 树使得范围查找,排序查找,分组查找以及去重查找变得很简单。而且 B+ 树中各个页之间也是通过双向链表连接的,叶子节点间的数据是通过单向链表连接的。
- B 树因为数据分散在各个节点,要实现这一点是很不容易的。