mysql索引数据结构浅谈个人理解

一句话总结:索引是一种排好序的数据结构
先来讨论下一些简单的树形结构:
二叉搜索树:简单来讲一个父节点,左子节点放小于更节点数,右子节点放大于父节点数
上图
看起来不错,为什么索引不用这种结构呢,因为他有个致命缺点,单边增长,假如我们数据是自增插入的,看看结构是什么样在这里插入图片描述
我的天啊,这和链表有什么区别,加入我很不幸的查询的是最大一个数,你得把整个数据挨个查出来,时间复杂度o(n).

平衡二叉树:任意节点的子树的高度差都小于等于 1,也就是放置了单边增长问题。(实际应用不使用,多使用红黑树)
在这里插入图片描述

平衡的方式:最小不平衡子树
LL 型:最小不平衡子树 右旋
RR 型:最小不平衡子树左旋
LR 型:最小不平衡子树的右子树先左旋,再最小不平衡子树右旋
RL 型:最小不平衡子树的左子树先右旋,再最小不平衡子树左旋

红黑树:红黑树有很多讲究
1.每个节点要么是黑色,要么就是红色
2.根节点也就是root节点必须是黑色
3.叶子节点和null节点是黑节点
4.从红黑树的任意一个节点出发到它的叶子节点,它所经过的黑节点数都是相同的,这就是红黑树所需要实现的平衡(也就是说,当前节点的每一条分支路径,它们所包括的黑节点数是一样的,最差的情况就是红黑相间)
5.新插入的节点是红节点,(可能在参与平衡操作时会变成黑节点加入直接插入的节点就是黑节点的话,那么每插入一个节点肯定都要做旋转或者变色来达到平衡。但是如果新插入的是红节点且它的父节点是黑节点的话,那就直接插入,整棵树还是平衡的,就不需要再做平衡处理了)
至于增么平衡满足规则,可以找个文档看下,此处不细讲,加单提下。插入的颜色必须是红的,如果和父节点颜色一致,就需要变色,叔节点如果颜色不一致还需要旋转等。

至此快速停下,不然和标题跑偏了
我们为什么不使用平衡或者红黑树作为索引呢?
从实际出发,我们使用索引是不是因为数据很多,假如一个1千万的数据,你使用上面的树结构,你敢想象他的树高有多少吗。

B-TREE:
每个节点存放了很多索引,这样做的目的就是为了降低树的高度,减少IO次数。而且从下图中可以看出2个关键点,每个索引里面都包含了数据,叶子节点没有指针,后面的B+TREE就有,可以做范围检索。
在这里插入图片描述
hash结构
对索引的key进行hash算出一个位置存储位置
做精准匹配效率比B-TREE B+TREE都要高,但是要解决hash冲突问题,也不能做范围匹配
在这里插入图片描述
至此落地B+TREE
下图中可以看出优点是B-tree不具备的,
1.只有叶子节点存储数据(每个节点可以放更多的索引关键字)
2.叶子节点索引有箭头指针,可以通过快速定位相邻数据(范围查找)在这里插入图片描述
手动计算下他的高度,首先数据库有个页的概念,大小是16KB,意思就是每一次IO加载到内存中的大小。假如一个索引字段是long占8B+指向下一个区间的指针6B。16KB/14B=1170,最后的叶子节点及时有数据我们放大60倍,一页也有20个索引关键。高度为3的B+TREE能存多少数据简单计算1170117020=2.7千万。
至此B+tree就想说你还有什么理由拒绝成妾呢!!!

然后扩展下,提几个问题大家讨论下给出高见:innodb搜索引擎下
1.为什么要建议给一个主键索引
2.为什么主键建议整数自增
3.为什么辅助索引(非聚集索引)的叶子节点要存储主键索值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值