799 字
4 分钟
面试鸭刷题-为什么MySQL选择B+树作为索引结构?

为什么MySQL选择B+树作为索引结构?#

最主要的原因是:选择B+树作为索引结构,磁盘IO次数少。

而B+树能做到这一点,这主要有三个原因:

  1. 树矮,B+树是多叉树,一个节点可以存储特别多的key,3层的B+树可以存储2000多万条数据,查任何一条数据最多只需要3次磁盘IO,效率极高。
  2. 非叶子节点只存储key和指针,使得一个16kb的页中可以存储更多的索引项,内存能换成更多索引。
  3. 叶子节点用双向链表连接起来,能快速实现范围查找,找到位置后直接顺着链表往后找就可以了。

提问:#

B树和B+树有什么区别?#

B树和B+树最主要的区别是数据存储位置,B+树的非叶子节点只存储key和指针,B树会存储数据。 这就导致了,在范围查询时,B树有时候还需要会到上一层去获取数据,并且时间也不固定。而B+树总是到叶子节点拿数据,且节点之间用双向链表连接起来,范围查询时直接顺着链表往后找即可。

三层B+树可以存多少数据?你是怎么算的?#

以InnoDB的默认页大小16kb为例,若是BIGINT这个8字节作为主键,页指针6字节,则一个叶子节点可以存储的索引数量为16kb/14b 大概有1170个左右,叶子节点存储完整的行数据,这里假设一行数据为1kb,那么叶子节点就可以存16条数据,那么就是1170*1170*16大约可以存储2000多万条数据。若一行的数据更小,则可以存储更多。

为什么MongoDB早期用B树,后面改成用B+树了?#

因为早期MongoDB的定位是文件数据库,以单文档查询为主,B树数据存储在非叶子节点,找到就可以立即返回,因此使用B树效率更高。而后面发现范围查找的需求变高了,因此改成了B+树的索引结构,更好的支持了范围查找和排序。

自适应哈希索引是怎么工作的?什么时候应该关掉它?#

InnoDB会监测查询,若发现有一个索引被很频繁的查询,就会自动在内存中创建它的哈希索引,后续查询它就直接走哈希索引不走B+树。但是在高并发场景下,维护哈希索引的锁竞争反而可能导致性能变差,这个时候就要检查是否是它导致的问题,若是的话就可以考虑关掉它。

为什么InnoDB要求主键尽量短?#

主要是两个原因,一个是因为主键越短,非叶子节点可以存储的索引数量就越多,同样层数下可以分的节点就越多。第二个原因是因为,二级索引的叶子节点都存储了主键值,主键越长,二级索引就越占空间。

面试鸭刷题-为什么MySQL选择B+树作为索引结构?
http://www.shineacz.top/posts/面试鸭-为什么mysql选择b树作为索引结构/
作者
shineAcZ
发布于
2026-03-12
许可协议
CC BY 4.0