【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

 

 

 

 

 

最终结构如下:

 

 

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

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

 

posted @ 2020-05-10 11:14  boluo1230  阅读(437)  评论(0编辑  收藏  举报