美文网首页
B+树是如何成为关系型数据库索引的主流数据结构的

B+树是如何成为关系型数据库索引的主流数据结构的

作者: 文景大大 | 来源:发表于2021-01-05 22:11 被阅读0次

一、非B+树不可吗?

数据库最常用的两个功能就是“等值查询”和“范围查询”。如果只是为了满足“等值查询”,那么Hash散列表和平衡二叉查找树都能胜任数据库索引这个使用场景,但是“范围查询”却加大了难度,使得它们不太适合了。

在原先讲过的“跳表”倒是很契合,但实际场景中,大家都是使用的B+树。

二、二叉树演变B+树过程

二叉树我们前面也都了解过了,我们来看下,用它来作为索引的数据结构会存在什么问题?首先它是能够满足“等值查询”的,但是无法进行“范围查询”,所以,我们需要对其进行改造:

  • 树中的每个节点都不存储具体的数据,而是存储索引;
  • 叶子节点从左到右用双向链表绑定起来;

改造前后的二叉树结构示意图如下:

二叉树改造前后示意图

改造后的好处是:

  • 只是存储索引的话,使得二叉树的大小不会很大;
  • 叶子节点使用双向链表串起来之后,就可以进行范围查找了;
  • 等值查找的时间复杂度还是树高O(logn);

看上去还不错,但是实际使用时有问题,因为我们数据库中需要存储的数据实在是非常多,如果使用这样的改造后的二叉树,树的高度将是非常惊人的。不但查找起来非常缓慢,而且这么多节点全部加载到内存中也是不现实的。

我们再次进行如下的改造:

  • 只把所有索引树的根节点放入到内存中,其它子节点都放到磁盘上;
  • 将二叉树改造为m叉树,每个节点的子节点个数最多为m个,如此树的高度就大大降低了,减少了IO磁盘查找的次数;
  • 每个子节点的大小不能超过一页的大小,通常为4kb,保证m最大的同时,OS单次读页就能将该节点加载完毕;

改造后的数据结构示意图如下:

B+树改造示意图

改造后的好处是:

  • 没有把索引树的全部节点加载到内存,减少了内存的压力;
  • m叉树使得索引树的高度尽可能降低了,减少了IO查找节点的次数,提高了时间效率;
  • m取值有了理论依据,使得时间效率最大化;

但同时也有部分缺点:

  • 数据的写入和删除都会导致索引的更新,从而需要更改索引树;
  • 当插入数据的时候,如果某个节点的子节点个数超过m,就需要分裂,极端情况下,需要从下往上传导分裂;
  • 当删除数据的时候,如果某个节点的个数小于m/2,则需要合并节点,否则这样的节点多了,影响查询效率;

三、B+树总结

  • 每个节点中的子节点个数不能超过m,不能小于m/2;
  • 根节点的子节点个数可以小于m/2,但是不能超过m;
  • 每个节点只存储索引,并不存储数据;
  • 所有叶子节点都是双链表串联的,方便范围查找;
  • 根节点会被存储在内存中,其它节点存储在磁盘中;

四、和B树的关系

B+树是在B树的基础上改进的,B树中每个节点是存储真实的数据的,所以整个树会很大;B树的叶子节点是没有用链表串联的,所以还是无法满足范围查找的场景;因此,B树其实就是一个子节点不能小于m/2的m叉树;

B+树和B树的关系,以及MySQL中不同存储引擎数据结构的不同可以参考《如何理解数据库的索引?》

相关文章

  • MySQL系列-InnoDB索引

    B+树索引 B+树索引就是传统意义上的索引,这是目前关系型数据库系统中查找最为常用的和最为有效的索引。 B+树的结...

  • B+树是如何成为关系型数据库索引的主流数据结构的

    一、非B+树不可吗? 数据库最常用的两个功能就是“等值查询”和“范围查询”。如果只是为了满足“等值查询”,那么Ha...

  • 【二】B+树

    前言 B+树挺重要的,数据库索引就是用的B+树。 思考 为什么数据库索引不使用hash表或者其他数据结构。 定义 ...

  • 索引四 LSM树

    一 背景 本来想写点B+树的,不过B+树因为用在Mysql等关系型数据库中,大家都比较了解了,而LSM树这种索引设...

  • B+树

    引出 听闻B+树,都是因为是数据库索引的数据结构。那为什么别的数据结构解决不了索引的问题,必须弄出来一个B+树呢。...

  • 面试不要再问“索引基础知识”了

    1 什么是索引 索引可加快检索的速度,提升查询性能,当前关系型数据库普遍采用的B+树索引,此索引是一种按字段排序的...

  • mysql-索引

    mysql-索引 按数据结构分类 B树索引-NOSQL使用较多 B+树索引 hash索引-KV数据库上比较常见 位...

  • Mysql DBA-索引篇

    索引类型: 1.按照数据结构角度:B+树索引,哈希索引,FULLTEXT索引 1)B+树索引: B+的特性:1.所...

  • 一天一道面试题——数据库篇4(MySQL索引)

    说一说MySQL索引。 索引定义 为了提高检索数据库的数据的数据结构。 索引分类 根据数据结构分类 B+树索引,哈...

  • mysql索引

    从数据结构角度 1、B+树索引(O(log(n))):关于B+树索引,可以参考MySQL索引背后的数据结构及算法原...

网友评论

      本文标题:B+树是如何成为关系型数据库索引的主流数据结构的

      本文链接:https://www.haomeiwen.com/subject/xahgoktx.html