【MySQL】索引的本质(B+Tree)解析

本文深入解析MySQL中B+Tree索引的工作原理,包括其数据结构特点、索引查询机制以及节点单位和大小。通过实例说明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

 

最终结构如下:

 如果我们想查找【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万+(个)】索引。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值