【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万+(个)】索引。
所以就算千万级的数据,在我们的索引内部都绰绰有余。
学而不思则罔 思而不学则殆 !