(1)MYSQL索引之MySQL索引数据结构为什么使用B+树

本次应该算是一个小系列,分为三节。描述一下Mysql的索引底层的原理的一些知识,,第一节主要分析总结一下对于MySQL索引数据结构为什么使用B+树这种数据结构呢?
对于这个问题,我们着重讨论这么几种数据结构,hash存储,二叉平衡树存储,B树存储,B+树存储,为什么Mysql最终在这些数据结构终选择了B+树这种数据结构呢?我们用https://www.cs.usfca.edu/~galles/visualization/这个网站来构建数据结构图。

1、hash存储

一个长度为11的哈希表结构
上图是一个长度未11的哈希表,每次在通过散列函数存储数据进入哈希表的时候,我们最终得到得地址是一个无序得,这种无序得地址存储得数据自然也就是无序得(至于为何无序,建议学学hash得知识,这里不做讲解)。所以虽然哈希查找就是时间复杂度为1,直接就命中查找,速度十分的快。
但是也存在一个问题,就是当你是做范围查找的时候,因为它的无序,你无法命中你得范围,你只能还是一个一个的去查,导致你的范围检索没有意义。而mysql中存在大量的范围查找语句,也不难想象为什么mysql不用这种数据结构查找了。

2、二叉平衡树AVL

二叉平衡树就是红黑树,之后在看hashmap的时候注意一下。下图是一颗有十个节点的二叉平衡树,这里扩展一句画外音,平衡树的任意左右子树的高度差的绝对值不会超过1。
一颗十个节点的二叉平衡树

二叉平衡树其实在考研的时候没少看,但是现在都还回去了,我们看到这种数据结构首先它的树高不低(和后面的B树和B+树对比),但是因为它是一棵排序树,所以支持二分查找,这样会提高效率,不然它根本没资格进入讨论的范围。
但是它有一个问题,就是比如上图中我们查找数据5的时候,先不说它走两次才能到5节点。比如我们要查找比大于5的节点数据,首先我们要定位到5这个节点,走两次,然后我们还得回溯到父节点6,然后再遍历6的子树,才能查到大于5的数据,当数据量大的时候,这无疑是很坑爹的。所以它也被pass了。

3、Btree(B树)

首先我希望大家心里永远有B数,B树作为Mysql索引的男二号,是很有意义的,我一直认为它起到了桥梁的作用。
下图是一颗有十个节点的B树。一颗有十个节点的B树

不难看到,B树因为能一个节点存两个数据的原因(具体原理数据结构模块见),它的树高被降低了,这样就比AVL的查询效率要高一些了,但是我们还是没有解决了平衡二叉树中的范围查找的回溯问题。致使它也被抛弃了。

4、B+tree(B+树)

我们的男一号出场了,B+树是对B树的一个升级优化,具体原理见数据结构板块。
这是一个有十个节点的B+树

我们看到B+树是拥有B树的优点(一个节点存两个数据,可以降低树高。),我们也看到B+树它有两种数据,一种事非叶子节点,一种是叶子节点。这里说一下,B+树中有约定,非叶子节点存的就是数据的索引,可以理解为指针,它就是做一个指向,方便查询。真正的数据存在了叶子节点中,叶子节点中既有指针又有数据(数据指的是存数据的物理地址),所以最后所有的数据查询都要落实到叶子节点中,然后拿到物理地址跑到磁盘中取到真正的数据。
而且B+树还有一个机制,我们看到叶子节点中存储数据的时候是有序的,它排好了序,并且拥有指向下一个数据的指针,是一个单向有序的链表。所以当你执行查找大于5的数据,你在叶子节点找到5的时候,直接相当于就能从链表中取到所有后面大于5的数据,避免了查找的回溯问题。看到这里,我有点理解那种熟练使用数据结构的大佬们的自由了,信手拈来的神来之笔,这可能就是最高境界吧。所以B+树的这些优点让他成为的主角。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值