B树和B+树
[TOC]
参考:B树、B+树详解
前言
B+ 树是一种存储结构,常用在数据库建立索引。
准备知识
m阶的树:树最大分叉有m个,即子节点数最大为m个;
根节点:没有父节点的节点;
叶节点:没有子节点的节点;
内部节点:不是根、叶节点的节点;
二叉搜索树:左子树中的值要比根节点值 小,右子树中的值要比根节点值 大;
平衡二叉树:二叉搜索树的特殊情况,左右子树高度一样;
一、B树
B数是平衡多叉树,一个m阶的B树,有如下特性:
- 内部节点最少得有ceil(m/2)个子节点;
- 根节点不是叶节点时,至少得有2个子节点,即2阶;
- m阶的节点中包含m-1个数据;
- 所有叶子节点高度一致;
二、B+树
B+树是B树变体,对其规则做了些改变。改变如下:
- 叶子结点由一个有序数组和指向其右边一个叶子结点的指针组成;
非叶子节点由一个有序数组组成,但是数组元素由一个索引值一个指针组成;
- 指针:指向一个叶子节点;
- 索引值:指向的那个叶子节点中最小的索引值;
- 非叶节点,是工具节点,用于快速找到指定叶节点,只有叶节点才存储真正的数据(一行数据);
- 叶子节点们类似一个有序链表;
- m阶的节点中包含m个数据;
注:mysql B+树的叶子结点是一个双链表,且尾部叶子节点还指向头部叶子节点。
2.1 为什么B+树适合数据库?
- B+树便于范围查询,这是最主要的。
只需要查找最左边范围即可,查到后遍历往右遍历叶子结点,知道碰到右边范围结束,这样就筛出了所有范围内数据。
B树的范围查找用的是中序遍历,而B+树用的是在链表上遍历;
- B+树的磁盘读写代价更低。
Mysql最小存储单位为页,每次访问数据都是一页一页加载(访问一页就是一次IO),Mysql的索引树建立自然就是以页为单位,即一个节点就是一页。由于B+树在非叶子节点仅存储索引数据,那么读一页数据,即一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;
- B+树查询效率更加稳定
由于非叶子节点并不是最终指向文件内容的结点,所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。