MySQL数据库索引的数据结构

本文探讨MySQL索引选用B+树数据结构的原因。MySQL索引结构取决于存储引擎,主流的Innodb采用B+树。文章对比了哈希表、红黑树、B树和B+树,指出哈希表不适合模糊和范围查询,红黑树元素多时树高导致IO多,B+树在范围查询、查询稳定性和减少硬盘IO上有优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么选用B+树这个数据结构

MySQL索引的数据结构其实并非是定式,主要取决于mysql使用的是哪个存储引擎.
而mysql支持多种存储引擎,其中Innodb是当下最主流的一种方式,Innodb中的数据结构是B+树.
想要了解Innodb存储引擎的小伙伴,可以自行去了解一下,这里不11讲解了.
我们不要忘记索引的目的是什么?
快速查找,我们应该选取最快的查找数据的数据结构.

我们先来看看学过的一些数据结构,比如说

哈希表:

非常优秀的数据结构,在查询,插入,删除,修改数据时有着O(1)的时间复杂度,但它还是不适合数据库的查询场景.
哈希表需要把给定的key通过hash函数映射出一个具体的下表,才能定位到具体的位置.
不要忘了,mysql有着模糊查询和范围查询的,哈希表就被抛弃了.

红黑树:

在插入,删除,修改,查询时的时间复杂度是O(logn).
红黑树中的数据是有序的,可以进行范围查询.也可以进行模糊匹配.
但是,红黑树最大的问题在于,当元素数量比较多时,树的高度会非常高.
高度越高,比较的次数就越多,因为索引这样的数据结构是存储在硬盘上的,意味着硬盘的IO操作也会非常多,所以,我们也抛弃了红黑树.

B树

我们先来看看B树长什么样子吧.
在这里插入图片描述
我们可以看到,此时每个节点都可以保存多个数据了,当总元素个数固定时,相比于二叉搜索树,树的高度大大降低了,随之带来的,硬盘IO开销也减少了.
因为B树中每个节点都存储了各自的元素,节点占据的空间就会比较大,没办法在内存中进行缓存了.
你们有没有这样一个疑问?
一个节点上有多个key相比于一个节点上有一个key,对于硬盘的开销会增大很多吗?
其实不会的,就只是多访问了一个数据而已,不会增大很多开销.

B+树

在B树的基础上,又做出了一些改进,形成了B+树.

在这里插入图片描述

对于B+树,总结出三个特点:

  1. B+树也是N叉搜索树,N个key就有N个区间,节点的最后一个key就是最大值或最小值了.
  2. 父节点的key会在子节点中以最大值的身份重复出现,叶子节点包含了整个数据全集.
  3. 其中,叶子结点按照链表的身份,首尾相连,便于"范围查询".

相对的,对于B+树.也产生了很多优势,我总结了三点:

  1. 比较擅长范围查询.
  2. 所有的查询操作,最后都会在叶子节点上,比较时间均衡,查询时间稳定.(稳定有时比效率更加重要)
  3. 因为叶子节点是存储了数据全集,所以表中的每一行数据的其它列,都可以保存到叶子节点上,而非叶子结点,只存储构建索引的key就可以了(非叶子节点的存储空间可以在内存中缓存一份,可以减少硬盘IO的次数).

结语

家人们有问题可以在评论区提问哈,你们的支持是我最大的动力!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值