本文没有太多原理性的东西,只是简单分析mysql采用B+树的原因。 要知道MySQL采用B+树的原因,首先有必要介绍下树从二叉树到B树再到B+树的演变。
二叉树
B树
如图为M阶B树(M=4),从图中可以看出
1:根节点至少2个子节点
2:每个节点key的数量为[M/2-1,M-1],即最多有3路,并且升序排列
3:每个节点存储key和data
4:所有叶子节点在同一层
5:每个叶子节点指向的外部指针都为NULL
B+树
如图为M阶B+树(M=4),从图中可以看出,与B树有所不同
1:非叶子节点不保存data,只保存索引
2:某一节点有几个子节点,就有几个key
3:所有key都在叶子节点出现
4:所有叶子节点链接成一个有序的链表
B树和B+树都是矮胖树
1:数据库为什么不选择二叉树?
二叉树的高度相比于B和B+树更高,所以高度越低,IO次数越少,存取效率越高
2:数据库为什么不选择B树,而选择B+树?
1:B+树每个叶子节点都有一个指向相邻叶子节点的指针。数据库的查询往往会有针对范围的查找,不可避免的需要遍历整棵树或者部分子树,B+树只需要遍历叶子节点就可以遍历整棵树,查询效率要远远高于B树
2:非叶子节点不存储data,只存储key值,这样每个非叶子节点就可以存储更多的key,能读到内存中的key也就越多,内存操作的效率要远远高于磁盘I/O操作