文章目录
- 一、前言
- 二、关于B-Tree和B+ Tree
- 2.1 B-Tree
- 2.2 B+Tree
- 三、B Tree与B+ Tree的差异
- 3.1 叶子节点的差异
- 3.2 数据访问的差异
- 3.3 范围查询的差异
- 四、Mysql中B+Tree的应用场景
- 4.1 主键索引
- 4.2 唯一索引
- 4.3 普通索引
- 五、MySQL为什么使用B+Tree来做索引?
- 总结
一、前言
本文已收录于PHP全栈系列专栏:PHP面试专区。
计划将全覆盖PHP开发领域所有的面试题,对标资深工程师/架构师序列
,欢迎大家提前关注锁定。
二、关于B-Tree和B+ Tree
2.1 B-Tree
B-Tree是一种平衡树,它的定义比较简单,每一个节点都有m个子节点,每个节点从小到大排列,对于一个含有n个关键字的B Tree,可以分为logm(n)层,根节点也算一层,所以高度最多是logm(n),这保证了B Tree的查找效率。
2.2 B+Tree
B+ Tree也是一种平衡树,与B Tree不同的是,B+ Tree在叶子节点上存放所有关键字,内部节点只存放关键字的索引。这样做优点在于:
- 内部节点的关键字比叶子节点少,可以让节点变得更小,一块磁盘能够存储的节点数量更多;
- 叶子节点形成一个有序链表,方便进行范围查询。
三、B Tree与B+ Tree的差异
3.1 叶子节点的差异
B Tree与B+ Tree的最大区别在于叶子节点存放的内容:B Tree的叶子节点既存放关键字索引,也存放数据;而B+ Tree的叶子节点只存放关键字和指向数据的指针。
3.2 数据访问的差异
B Tree和B+ Tree的索引实现原理相似,都是通过比较关键字大小进行节点的递归查找,不同之处在于,B Tree查找到目标关键字后就可以直接返回数据,而B+ Tree则需要通过叶子节点的指针再次访问磁盘才能返回数据。
3.3 范围查询的差异
B+ Tree天生自带范围查询优势,因为叶子节点形成的链表是有序的。而B Tree则需要进行全局遍历,效率较低。
四、Mysql中B+Tree的应用场景
Mysql中的索引是基于B+ Tree实现的,所以B+ Tree适用于Mysql中所有的索引,包括主键索引、唯一索引和普通索引等。
4.1 主键索引
主键索引是一个表中的主键或唯一索引,它可以用来保证表中每一行都具有唯一性。在Mysql中,如果没有主键或唯一索引,那么InnoDB存储引擎会默认生成一个6字节的ROWID作为主键。在Mysql中,主键索引是B+ Tree结构,它对于数据插入和修改的操作非常高效,同时也可以用来加速关联查询。
4.2 唯一索引
唯一索引是与主键索引类似的结构,它可以保证表中某一列或多列的唯一性,如果插入的数据违反了唯一性约束,则会触发错误。唯一索引与主键索引的区别在于,唯一索引允许null值。
4.3 普通索引
普通索引是最常用的索引类型,它可以加速查询某一列的操作。在Mysql中,普通索引也是B+ Tree结构,可以加速等值查询、范围查询和排序操作。
五、MySQL为什么使用B+Tree来做索引?
通过上面的对比,应该知道B-Tree和B+Tree的区别了。MySQL为什么要用B+Tree来做索引可以看下面的解释。
总结
总之,B+ Tree是一种适用于磁盘存储的平衡树,由于在磁盘上读写数据的时间比在内存中读写数据慢,因此B+ Tree能够更好地适应磁盘存储,提高数据的读写效率。在Mysql中,B+ Tree被广泛应用于索引的实现,保证了数据库查询的性能。