mysql 二叉树存储_彻底搞懂MySQL为什么要使用B+树索引

MySQL存储结构以页为基础,B+树作为索引结构。B+树的特点包括:叶子节点存储数据和形成有序链表,非叶子节点仅存储索引,所有查询必须到达叶子节点。这种结构减少了I/O操作,提升了检索效率,尤其适合大数据量的查询。相比于二叉树和B树,B+树的高度更低,性能更优。
摘要由CSDN通过智能技术生成

目录

搞懂这个问题之前,我们首先来看一下MySQL表的存储结构,再分别对比二叉树、多叉树、B树和B+树的区别就都懂了。

MySQL的存储结构

表存储结构

ad933b0d12117842384ba50b06b337e6.png

单元:表>段>区>页>行

在数据库中, 岂论读一行,照样读多行,都是将这些行所在的页举行加载。也就是说存储空间的基本单元是页。

一个页就是一棵树B+树的节点,数据库I/O操作的最小单元是页,与数据库相关的内容都市存储在页的结构里。

B+树索引结构

497810ddad727223ae28865b941ba459.png

在一棵B+树中,每个节点为都是一个页,每次新建节点的时刻,就会申请一个页空间

统一层的节点为之间,通过页的结构组成了一个双向链表

非叶子节点为,包罗了多个索引行,每个索引行里存储索引键和指向下一层页面的指针

叶子节点为,存储了关键字和行纪录,在节点内部(也就是页结构的内部)纪录之间是一个单向的表

B+树页节点结构

9dd63ece00ce3e8acd6c8b1c1dda116b.png

有以下几个特点

将所有的纪录分成几个组, 每组会存储多条纪录,

页目录存储的是槽(slot),槽相当于分组纪录的索引,每个槽指针指向了差别组的最后一个纪录

我们通过槽定位到组,再查看组中的纪录

页的主要作用是存储纪录,在页中纪录以单链表的形式举行存储。

单链表优点是插入、删除利便,瑕玷是检索效率不高,最坏的情形要遍历链表所有的节点。因此页目录中提供了二分查找的方式,来提高纪录的检索效率。

B+树的检索历程

我们再来看下B+树的检索历程

从B+树的根最先,逐层找到叶子节点。

找到叶子节点为对应的数据页,将数据叶加载到内存中,通过页目录的槽接纳二分查找的方式先找到一个大略的纪录分组。

在分组中通过链表遍历的方式举行纪录的查找。

为什么要用B+树索引

数据库接见数据要通过页,一个页就是一个B+树节点,接见一个节点相当于一次I/O操作,以是越快能找到节点,查找性能越好。

B+树的特点就是够矮够胖,能有效地削减接见节点次数从而提高性能。

下面,我们来对比一个二叉树、多叉树、B树和B+树。

二叉树

98a44dd3e7383a49ec15cd125c71a934.png

二叉树是一种二分查找树,有很好的查找性能,相当于二分查找。

然则当N对照大的时刻,树的深度对照高。数据查询的时间主要依赖于磁盘IO的次数,二叉树深度越大,查找的次数越多,性能越差。

最坏的情形是退化成了链表,如下图

9b4727f2fe3e5815432573a0fedb18aa.png

为了让二叉树不至于退化成链表,人们发明晰AVL树(平衡二叉搜索树):任何结点的左子树和右子树高度最多相差1

多叉树

216ca76909e81205d7e07ec3bfd48cb1.png

多叉树就是节点可以是M个,能有效地削减高度,高度变小后,节点变少I/O自然少,性能比二叉树好了

B树

e936da4d6c201b6d5829168cf39c3697.png

B树简朴地说就是多叉树,每个叶子会存储数据,和指向下一个节点的指针。

例如要查找9,步骤如下

我们与根节点的关键字 (17,35)举行对照,9 小于 17 那么获得指针 P1;

根据指针 P1 找到磁盘块 2,关键字为(8,12),由于 9 在 8 和 12 之间,以是我们获得指针 P2;

根据指针 P2 找到磁盘块 6,关键字为(9,10),然后我们找到了关键字 9。

B+树

252a7afd7889e93b99532661628f5453.png

B+树是B树的改善,简朴地说是:只有叶子节点才存数据,非叶子节点是存储的指针;所有叶子节点组成一个有序链表

例如要查找关键字16,步骤如下

与根节点的关键字 (1,18,35) 举行对照,16 在 1 和 18 之间,获得指针 P1(指向磁盘块 2)

找到磁盘块 2,关键字为(1,8,14),由于 16 大于 14,以是获得指针 P3(指向磁盘块 7)

找到磁盘块 7,关键字为(14,16,17),然后我们找到了关键字 16,以是可以找到关键字 16 所对应的数据。

B+树与B树的差别:

B+树非叶子节点不存在数据只存索引,B树非叶子节点存储数据

B+树使用双向链表勾通所有叶子节点,区间查询效率更高,由于所有数据都在B+树的叶子节点,然则B树则需要通过中序遍历才气完成查询局限的查找。

B+树每次都必须查询到叶子节点才气找到数据,而B树查询的数据可能不在叶子节点,也可能在,这样就会造成查询的效率的不稳定

B+树查询效率更高,由于B+树矮更胖,高度小,查询发生的I/O最少。

这就是MySQL使用B+树的缘故原由,就是这么简朴!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值