mysql 内部解析树_【MySQL】索引的本质(B+Tree)解析

索引是帮助MySQL高效获取数据的排好序的数据结构。

索引数据结构

二叉树

红黑树

Hash表

B-Tree

MySQL所使用为B+Tree (B-Tree变种)

非叶子节点不存储data,只存储索引(冗余),可以放更多的索引(说白了就是每一次索引查询都要查询到叶子节点)

叶子节点包含所有索引字段

叶子节点用指针连接,提高区间访问的性能

我们看下这个动图来了解一下B+Tree的形成结构: 8 5 15 18 2 11 1 3 6 9 13

c7237f0598a311dbdd03994a33a0d8bc.gif

最终结构如下:

8da7381677a52d292edff447eec4bf80.png

如果我们想查找【0013】这个节点,我们来描述一下B+Tree在MySQL中的查找机制:1》首先将根节点【0008】一次性load到内存中,此时进行了一次磁盘I/O,然后在内存中做随机查找,内存查找可以说是非常快的,时间可忽略不计;2》由于13大于8,所以接下来我们将节点【0011】load到内存中,以此类推;3》最终我们定位到【0011 0013】这个节点

通常会有面试这么问:B+Tree索引的节点单位是什么?大小是多少?

B+Tree聚簇索引索引节点的单位是数据页,默认大小为16K,支持的大小对应选项值为64k,32k,16k,8k,4k

此时我们有1000万个数据构建的B+树索引,那么索引树具体情况是什么样的呢?

通常我们一个B+树节点大小为16KB,那么一个节点可以放多少索引记录呢?

我们假设当前这个索引树就是主键索引,1个索引占用存储空间大概是8bytes,

每个索引还有一个指向下一个节点的指针,大概是6bytes,

所以一个索引节点大概存放【16kb / 14bytes ≈ 1170(个)】,所以每个节点大概可以放1170个节点,

由于叶子节点是会存放数据的,可能每个索引占用数据量会大一些,我们就约算为1KB,那么每个索引节点大约可以存放16个数据,所以一个索引树大概一共可以存储多少个元素呢?

大概可以存放【1170 * 1170 * 16 ≈ 2000万+(个)】索引。

所以就算千万级的数据,在我们的索引内部都绰绰有余。

9944db812a8dda4ef569345d3ea35901.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值