InnoDB 索引为什么要采用 B+tree 这种数据结构

InnoDB 索引为什么要采用 B+tree 这种数据结构?

一 B-tree

B树也称B-tree,它是一棵多路平衡查找树

描述一颗B树时需要指定它的阶数,阶数表示了一个节点最多有多少个孩子节点,一般用字母 m 表示阶数。

  1. 每个节点最多有 m 个子树,以及最多 m-1 个关键字)。
  2. 根节点最少有 2 个子树,可以只有 1 个关键字。
  3. 非根节点至少有 m/2 个关键字。
  4. 每个节点中的关键字都升序排列
  5. 所有叶子节点都位于同一层。
  6. 每个节点都存有索引和数据,也就是对应的 key 和 value。

    如下,是 B-tree:

    图片说明

所以,根节点的关键字数量范围:1 <= k <= m-1,非根节点的关键字数量范围:m/2 <= k <= m-1。

二 介绍 B+tree 的数据结构?

B+tree 是在 B-tree 的基础上,新增加了两个要求:

  1. B+树有两种类型的节点:内部结点(也称索引结点)和叶子结点。内部节点就是非叶子节点,内部节点只存储索引,数据都存储在叶子节点。
  2. B+树叶子节点保存了父节点的所有关键字和关键字记录的指针,每个叶子节点的关键字从小到大链接,构成一个链表结构。

    如下,是 B+tree:

    图片说明

三 B+tree 相比 B-tree 的优势

  • 单一节点存储的元素更多,使得查询的 I/O 次数更少,所以也就使得它更适合做为数据库MySQL的底层数据结构了。
  • 所有的查询都要查找到叶子节点,查询性能是稳定的,而 B-tree,每个节点都可以查找到数据,所以不稳定。
  • B+tree,所有的叶子节点形成了一个有序链表,更加便于查找。

四 InnoDB 采用 B+tree 实现索引的原理

参考下图:

图片说明

图片来源:《高性能 MySQL,P143》

B+tree 索引能够加快访问数据的速度,因为存储引擎不需要通过全表扫描来获取需要的数据,而是从索引的根节点进行搜索。根节点存放了指向子节点的指针,存储引擎通过这些指针向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,最终存储引擎就可以找到对应的值或者记录不存在。

参考资料

  1. 《高性能 MySQL:第 3版》
  2. 《面试官问你B树和B+树,就把这篇文章丢给他》
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-26 15:37
1、这群人晚上&nbsp;11&nbsp;点发朋友圈:"凌晨&nbsp;11&nbsp;点,三环的灯还亮着。"&nbsp;实际下班时间:19:30。2、什么是嘉豪呀?我最近在字节实习,没什么时间上网3、同龄人:学校社团、酒吧蹦迪;我:acm、字节/腾讯实习4、别人朋友圈发:“今天不想上课”;我朋友圈发:“今天的班就上到这里啦”,定位:字节跳动5、别人的朋友圈都是到处旅游的定位,我的朋友圈天天都是“字节定位”,还一定要是在【公司的健身房】里拍张照片,实际只练了10分钟,其中凹造型5分钟6、mentor布置任务的时候,别人都是:”好的收到“,我:”是不是要xxxx,xxxx这么做也可以吧,这个技术方案会不会更好些“7、别人书包里装的:王道408、轻薄本、四六级真题。我书包里面装的:显存24GB4090独显gpu(24小时开机运行,屏幕上贴着“字节/腾讯等贴纸”)、速效救心丸(代码报错用)、电棍(熬夜写代码困了用),就很……你们懂吧8、入职大厂第一件事:发朋友圈、发小红书,晒工牌,985计算机硕|字节实习生|可以接咨询|有偿改简历,9、别人的社交软件简介:25岁|男|希望遇见有趣的灵魂;嘉豪的社交软件简介:25岁|程序员|字节跳动工程师|一张佩戴工牌的自拍照大厂嘉豪标配:1.&nbsp;挂胸前的工牌(地铁里只挂不收,怕你看不见&nbsp;logo)2.&nbsp;降噪耳机(不放音乐也戴着,避免别人跟自己说话)3.&nbsp;印&nbsp;logo&nbsp;的电脑包(字节红&nbsp;/&nbsp;腾讯蓝&nbsp;/&nbsp;阿里橙&nbsp;/&nbsp;美团黄)4.&nbsp;手表(最好显示心率,午饭后必发"步数已破&nbsp;6,000")
布布永不言弃:可曾见过“我在未上市小厂实习,丢人了xxx”,然后接着说“这个小厂的创始人是张一鸣” 然后别人要是真不认识张一鸣 就直接急了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务