【数据库】mysql索引底层数据结构原理(为什么采用B+树而不采用链表、BST、AVL)

目录

磁盘IO

mysql索引的数据结构,各自优劣

常见问题

Q:数据库索引为什么要采用树结构存储,而不是采用数组或者链表的形式呢?

Q:关于B+Tree索引和Hash索引的优劣以及使用场景的区别

Q:为什么索引采取了树的结构,而不用普通的二叉树、二叉排序树或者二叉平衡树呢?

Q:为什么索引采用B+树而不采用B-树


这里我们首先要介绍一下磁盘IO的概念

磁盘IO

        数据的索引是存储在磁盘中的,当需要调用索引来查找数据的时候,我们需要将磁盘中的索引加载到内存中,然后供CPU进行操作,在内存中对数据的处理速度是远高于磁盘IO的速度的,所以速度损耗一般发生在磁盘的IO速度上

        磁盘IO就是磁盘的输入输出,将磁盘内容加载到内存与将内存中的内容放入磁盘

mysql索引的数据结构,各自优劣

索引的数据结构和具体的存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,InnoDB存储索引默认实现为:B+索引。对于哈希索引来说,底层的数据结构就是Hash表,因此在绝大多数需求为单条记录的查询的时候,可以选择Hash索引,查询性能快,其他情况建议选择B+Tree索引

常见问题

Q:数据库索引为什么要采用树结构存储,而不是采用数组或者链表的形式呢?

        A:因为数据库索引是建立在磁盘上的,当数据量比较大的时候,索引可能非常大,可能达到几个G,就导致无法一次性加载到内存中,采用树结构,树的每个节点都是一个磁盘页,当访问到该节点的时候,只需要将对应的磁盘页加载到内存中,不需要将全部内存加载到内存中,提高了内存的利用率

Q:关于B+Tree索引和Hash索引的优劣以及使用场景的区别

        就是与业务场景有关,如果只选择一个数据,hash更快,但是数据库中经常会选择多条数据,这时候因为B+树索引有序,并且又有链表系总量,他的查询效率比hash就要快的多了

Q:为什么索引采取了树的结构,而不用普通的二叉树、二叉排序树或者二叉平衡树呢?

        A:对于普通的二叉树,无法做到数据的有序性

        对于二叉排序树来说,平均的时间复杂度在O(logn)到O(n)之间,因为最好情况下二叉排序树就是平衡二叉树,平均查找的时间复杂度就是O(logn),特殊情况下会导致二叉排序树退化成链表,导致搜索效率变低,成为O(n),对于其他情况下效率在两者之间

        对于平衡二叉树来讲,从算法逻辑上说,查找速度和比较次数都是最小的,但是在索引层面,我们需要考虑到磁盘IO的问题。

        每当遍历索引树的一个节点,就代表进行了一次磁盘IO,所以最坏情况下,索引树的高度就是磁盘进行IO的次数,所以为了减少磁盘的IO次数,减少时间损耗,我们需要将树建立的矮胖

Q:为什么索引采用B+树而不采用B-树

        1.IO次数更少

                因为B+树的中间节点没有卫星数据,只有代表地址的数据,对应的节点就可以省下卫星数据的空间,所以同样大小的磁盘页可以容纳更多的节点元素

                代表着数据量相同的情况下B+树比B-树的高度更加低,查询时的IO次数也会更少

        2.查询性能更稳定

                因为B-树每个节点都存储着数据,B+树只有叶子结点存储着数据,所以B-树的查询性能并不稳定(最好情况是只查跟节点,最坏情况是查到叶子结点),而B+树的每一次查找都是稳定的

        3.范围查询更方便

                因为B+树底层是链表结构,所以在连续查询时只需要顺着底部的链表进行查询就可以了,而B-树需要在叶子结点、中间节点上反复横跳

参考文章

膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili

漫画:什么是B-树?

【面试现场】为什么MySQL数据库要用B+树存储索引?_小史

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值