mysql的innodb存储引擎为啥选择b+树索引结构?

hash


假设我们使用数组+链表的方式,对数组进行hash计算,数组的长度是8,那么hash一次,就是对数组的长度取余,也就是 数据值%8=放入索引的位置,10%8=2,也就是10放入索引2的位置
使用链表就是为了防止hash冲突,因为有的数据hash计算会存在相同的数据,虽然数组速度非常快,但是如果数据都放在了链表中,那么在范围查找的时候,就需要多次遍历,速度非常慢
所以mysql底层 也不会采用hash

二叉树


二叉树的特点就是,比根节点小的放在左子树,比根节点小的放在右子树,比根节点大的放在右子树,查找的时候可以一半的时间进行查询,但是在最差的情况下,
会退化成链表,要么都是左子树,要么都是右子树,树的高度也非常高,所以mysql底层也不使用二叉树


红黑树


红黑树是一种平衡的二叉树,他的节点为了保证平衡需要经历多次旋转,树的高度越高,那么就会非常耗时,所以mysql底层也不使用红黑树


b树


b树每个节点存储key,value,data,key就是主键值,value就是下一个指针页码的位置,也是磁盘的物理位置,就是存放在linux服务器,某个文件夹下的某个文件里面
,data存储这个主键对应的一行数据,而且key的值 是不能重复的,适合精确查询,但是在范围查询的时候,需要多次回表操作,就是需要从新 从根节点开始,一点点去往下找
所以mysql底层,也不使用b树


b+树


b+树就是对b树的升级,这里区分叶子节点和非叶子节点,叶子节点就是最后一层节点
非叶子节点key存储主键,value存储下一个页码的位置,非叶子节点不存储行数据,也就是data
而叶子节点存储完整的行记录,每个节点的key值是可以重复的
节点与节点之间构成了双向的链表,非常适合范围查询,不需要回表
从左边到右边依次是从小到大的,也就是有序,这也就是为啥我们使用索引查询的时候,数据都是有序的
所以mysql最终选择了b+树
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值