刨根问底:MySQL索引篇之索引存储结构

今天早晨和毕业生张某某,聊了会天儿,发现我们这边很多学生,在学习过程中真的是不重视MySQL,今天我们简单聊一下…

今天借着休息的时间,简单聊一下MySQL索引存储的问题:

  • 先说一个共识性问题:

给个别高频率查询数据表创建索引,能加快数据的查询速度。而不是给所有数据表,创建索引…

  • MySQL创建索引的数据结构为什么选择B+树,而不是其他树?
  1. 二叉树:存储过程中极容易出现极端情况:例如:如果数据是单边增长的情况 那么出现的就是和链表一样的数据结构了,查找层面无论你是单指针查找还是双指针查找,时间复杂度都是O(n);
    在这里插入图片描述
  2. 红黑树:在二叉树的基础上多了树平衡,但依然有一定概率出现下图极端情况:
    在这里插入图片描述
  3. B树:在红黑树的基础上,每个节点可以存放多个数据
    在这里插入图片描述
    这个时候我们查找6 只需要2个节点就可以了,而且树的高度也比红黑树矮。
  4. B+树:B树的变种,存储形式如图所示:
    在这里插入图片描述
  • 细心地铁子们会发现非叶子节点是会重复的,就像上面4,在叶子节点上面也出现了4,这是为什么呢?因为它需要在叶子上面存放数据。那又是怎么存放数据的呢?
  • 细化B树和B+树结构:
    在这里插入图片描述

在这里插入图片描述

  • B+树与B树(会同时在叶子节点和非叶子节点存储数据)不同,它只会在叶子节点上面挂载数据,非叶子节点不会存放数据,数据只会存在叶子节点上面,非叶子节点只存放索引列的数据
  • 这样一个节点就可以存放很多个索引列数据,一次IO就可以拿到很多数据,mysql默认的一个节点16K的大小,可以通过show global status like “Innodb_page_size” 看到该值是16384,每次IO读取16K大小的数据,以索引列是bigInt类型为例,大小8字节,每一条数据还有一个指向下一层的指针6字节,16384/(8+6)=1170,一个节点就大约可以存1170条数据。
  • 以一个层高为3的树为例,叶子节点存放数据之后大小1KB,那么这个树可以存放 1170 *1170 *16 =21,902,400,大约2200万条数据。所以在这种千万级的表中通过主键索引查找一条数据,最多3次IO就可以找到一条数据。而很多时候树的根节点基本都是在内存中,所以多数时候只需要2次IO。

总结说明:

  • 叶子节点之间也有双向指针连接,提高区间范围性能,范围查找。
  • 创建索引的时候,可以选择索引数据类型,一个是btree一个是hash,hash查找当然也快,但是当遇到范围查找的时候hash就尴尬了,所以根据实际业务需求来看是用btree还是hash。

既然你都看到这了,欢迎点赞、关注不迷路,燃烧我的青春,争取为大家提供更多优质的内容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值