面试宝典 | B树、B+树常见面试问答

192 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

为什么面试官常常喜欢问B树、B+树?因为这些数据结构跟数据库的引擎关系非常大,只有了解底层原理,在平时做技术选型时可能尽量避免踩坑。本篇不深入讲解数据库引擎,主要讲解这两种数据结在面试中的常见问题。

B树、B+树

先复习一下B树和B+树,重点结合数据结构图来看两者的差异点。

B树(又称B-树、B_树)

下图省略了叶子节点中的null指针。

B+树

下图省略了叶子节点中的null指针。

B树 VS B+树

结合图片来看,我们可以很容易发现B树和B+树之间的区别:

  • B+树的非叶子节点只用于索引,只有key没有value;而B树的节点都有key-value。
  • B+树的叶子节点通过指针连在一起;而B树没有。
  • B+树非叶子节点的子树指针与关键字个数相同,非叶子节点的指针P[i]指向子树的关键字key属于[K[i], K[i+1]);而B树非叶子节点的子树指针比关键字个数多1,非叶子节点的指针P[i]指向子树的关键字key属于(K[i], K[i+1])。

面试问题来了

Q1:Hash的查询效率都挺高的,为什么Mysql(InnoDB)不用它做索引?

使用Hash索引,单独查找一条记录,效率确实高,时间复杂度为O(1)。

select * from student where sid=1;

但是在实际需求场景中,经常会做范围查询,比如,查学号小于100的学生信息,这个时候Hash索引的查询效率就退化为O(n)。

select * from student where sid<100;

如果需求场景非常单一,就是只查单条记录,那可以考虑以Hash结构作为索引的数据库引擎。

Q2:AVL树、红黑树的查询效率都挺高的,为什么Mysql(InnoDB)不用这些做索引?

因为数据库索引保存在磁盘上,查找过程中,相同的key数量,使用AVL树、红黑树这类“瘦高”的树作为数据库索引的话,磁盘IO次数多,而使用B树、B+树这类“矮胖”的的树,可以减少磁盘IO次数。

Q3:B树、B+树作为索引的时候,一个节点多大合适?

这个涉及到操作系统层面,一次磁盘IO加载一个页的数据,节点大小等于页的大小比较合适。

Q4:为什么Mysql(InnoDB)不用B树做索引?

B树中各节点之间没有指针相邻,因此B树不适合做一些数据遍历操作。但是B+树的叶子节点上有指针进行相连,在做数据遍历的时候,只需要遍历叶子节点即可,这个特性使得B+树非常适合关系型数据库。包括一些offset、limit等操作,也更适合B+树。

Q5:为什么MongoDB不用B+树做索引?

MongoDB是NoSQL的数据库,非关系型的,需求场景跟关系型数据库不一样,选型选MongoDB的场景一般是做单一查询比较多,数据遍历操作比较少。如果用B树做索引,查询单条数据最好情况是O(1),最差是O(logn);如果用B+树做索引,查询单条数据的性能始终是O(logn),因为数据都在叶子节点上。用B树的话性能更高。

你学废了吗~