B-tree
- 什么是B-tree
- B-tree是一种多路自平衡搜索树,它类似普通的二叉树,但是Btree允许每个节点有更多的子节点。Btree示意图如下:
- 由上图可知 B-tree 的一些特点:
-
所有键值分布在整个树中
-
任何关键字出现且只出现在一个节点中
-
搜索有可能在非叶子节点结束
-
在关键字全集内做一次查找,性能逼近二分查找算法
来模拟下查找文件29的过程:(1) 根据根结点指针找到文件目录的根磁盘块1,将其中的信息导入内存。【磁盘IO操作1次】
(2) 此时内存中有两个文件名17,35和三个存储其他磁盘页面地址的数据。根据算法我们发现17<29<35,因此我们找到指针p2。
(3) 根据p2指针,我们定位到磁盘块3,并将其中的信息导入内存。【磁盘IO操作2次】
(4) 此时内存中有两个文件名26,30和三个存储其他磁盘页面地址的数据。根据算法我们发现26<29<30,因此我们找到指针p2。
(5) 根据p2指针,我们定位到磁盘块8,并将其中的信息导入内存。【磁盘IO操作3次】
(6) 此时内存中有两个文件名28,29。根据算法我们查找到文件29,并定位了该文件内存的磁盘地址。
-
用途
- 数据库中存取和查找文件(称为记录或键值)的一种方法
B+tree
B+树是B树的变体,也是一种多路平衡查找树,B+树的示意图为:
由图可看出B+tree的特点 同时也是 B-tree 和 B+tree的区别
- 所有关键字存储在叶子节点,非叶子节点不存储真正的data
- 为所有叶子节点增加了一个链指针
- 层级更低,IO 次数更少
- 每次都需要查询到叶子节点,查询性能稳定
- 叶子节点形成有序链表,范围查询方便
B-tree/B+tree区别
1、B+tree的所有关键字存储在叶子节点,非叶子节点不存储真正的data。
2、B+tree为所有叶子节点增加了一个链指针。
3、B+tree支持叶子节点的延展性(横向性)
为什么mysql的索引使用B+树而不是B树呢??
(1)B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。
(2)mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。