MYSQL索引
B-树: (balance tree)
● M阶 的 B树(也叫作 B-树), 即 M叉的多路平衡查找树, 特征:
定义任意非 叶子 结点 最多只有 M个 儿子; 且 m>2;
根结点的 儿子数 为 [2,m]
除 根 结点 以外的 非 叶子结点 的 儿子 数为 [m/2, m] ( m/2 向上取整);
每个结点存放 至少 m/2 -1 (向上取整)和 至多 M-1 个关键字; (至少2个 关键字)
非叶子结点 的 关键字个数 = 指向儿子的指针个数 -1 ;
非叶子结点 的 关键字: k[1], k[2], .... k[M-1]; 且 K[i] < k[i+1]
非叶子结点的指针: p[1], p[2]... p[m];其中 p[1]指向 关键字 小于 k[1]的子树, 且 p[m]指向关键字 大于 k[m-1] 的子树,其他 p[i] 指向 关键字 属于(k[i-1], k[i])的子树
所有叶子结点位于 同一层
B 树的 每个结点里 存放着 key, value 和 指针
● B树的 插入,删除 和 平衡等
B+树: (balance tree)
● B+树 是 B-树 的变种, 其定义基本与 B-树 相同 除了:
- 非叶子结点的 子树指针 与 关键字个数相同,
- 非叶子结点的 子树指针 p[i], 指向关键字 值 [kp[i], k[i+1]] 的子树, (例如:key=10, 他的子树在 10到20之间)
- 非叶子结点 仅用来 索引,数据都保存 在 叶子结点中
- 所有叶子结点 均有一个 链指针 指向下一个叶子结点
● 广泛用于各种 文件系统 和 数据库系统 比如
Windows : HPFS 文件系统
Mac : HFS, HFS+ 文件系统
Linux : ResiserFS, XFS, EXt3fs, JFS 文件系统
数据库 : Oracle, MySql, SqlServer 等
B+树 查找流程: 比如现在要查找 85,从 root 节点开始
B+树 比 B树的 优点
- B+ 树的 中间结点 只保存数据(key-value)中的 关键字(key), 不保存数据( 一条数据 由 key 和其他字段组成),所以磁盘页能容纳 更多的 点元素,更 矮胖
- B+ 树 查询必须 查找到 叶子结点, B树 只要匹配到 即可, 不管元素的位置, 因此 B+树 查找更稳定
- 对于 范围查找, B+树 只需要遍历 叶子结点链表即可, B树却需要 重复的 遍历整颗树
B+ 树 比 B-树 以及 二叉树 更加节省 磁盘IO
如果 树太大,就不能把整个树 全部都加载到内存中, 只能逐行 加载每一个 磁盘页(树的结点),要减少 IO 次数。即减少输的高度。 而 矮胖 就是 B+树的 特征之一(高度小),每个结点包含 M 个 子节点, m 称为 b树的阶。大小取决于 磁盘页的 大小。
一般情况: B+ 树都不会超过 四层, 一个页 存1000, 4层 1000^4