B树
B 树,平衡多路查找树。B 树是为磁盘等存储设备设计的一种平衡查找树。B 树结构的数据可以让系统高效的找到数据所在的磁盘块。
上图就是一个 B 树,紫色为 Key,黄色为 data,蓝色为指针。
相比于之前的 BST 多了在每一个磁盘页的索引比较,但是因为磁盘页已经被磁盘 IO 操作读取到了内存中。因为内存 IO 操作比磁盘 IO 操作省时很多根本不在一个数量级所以可以忽略不计,所以磁盘 IO 操作仍然是最重要的性能指标。
B 树相比于二叉搜索树压缩了深度,所以磁盘 IO 会比二叉搜索树少,能有效地提高新能,所以 B 树更适合索引
B+ 树
B+ 树是在 B 树的基础上的一种优化,使其更适合实现外存储索引结构。InnoDB 和 MyISAM 存储引擎都是使用 B+ 树实现其索引结构。
我们说过,B 树的索引和关键自 key-data 存储在磁盘里面,然后被磁盘 IO 操作读入内存。如果这个 data 很大的话,每次家在到内存中的 key 就会减少,这会使得 B 树的深度增加,这样还是会增加磁盘 IO 查询。
为了解决这个问题,B+ 树将所有数据记录节点按照键值的大小顺序存放在同一层叶子节点上,而非叶子节点只存储 key 值信息,这样可以大大增加每个节点存储的 key 值的数量,降低 B+ 树的高度。
非叶子节点只存储键值信息,所有叶子节点之间都有一个链指针,数据记录都存储于叶子节点中。
B 树与 B+ 树的区别
- B+ 树的磁盘读写更低,因为非叶子节点可以存储更多的索引 key,而 key 索引在同一层更集中,那么会降低磁盘 IO 读写次数。
- B+ 树的查询效率更稳定,任何查询都必须从根节点到叶子节点,路径是相似的,所以更稳定(最好最坏都在底层)。
- 区间访问友好性,MySQL 是关系型数据库,所以经常会按照区间来访问某个索引,B+ 树的叶子节点会按照顺序建立起链状指针,增强了区间访问性。