B+Tree

2021-07-23  本文已影响0人  意大利大炮

为什么InnoDB存储引擎使用B+Tree?

存储数据最小单元

名称 最小单元 大小
计算机磁盘存储数据 扇区 512字节
文件系统(XFS/EXT4) 4k
InnoDB存储引擎 页(page) 16k
image.png

B-Tree

一棵m阶的B-Tree有如下特性:

  1. 每个节点最多有m个孩子。
  2. 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
  3. 若根节点不是叶子节点,则至少有2个孩子
  4. 所有叶子节点都在同一层,且不包含其它关键字信息
  5. 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
  6. 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1
  7. ki(i=1,…n)为关键字,且关键字升序排序。
  8. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)


    image.png

B+Tree

数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。上面的B+Tree示例图在数据库中的实现即为聚集索引,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。而数据库中聚集索引只有一个,默认主键。其他用户创建的索引都是非聚集索引。

使用索引

WHERE
  1. 检索第一层:获取到1000个键
  2. 遍历(由于是有序的可以使用多分法)确定区间,或取到第二层的节点地址。
  3. 检索第二层:通过获取到的节点地址获取到1000个键,重复第2、3步,直致叶子阶段。
  4. 获取叶子节点的data(这里的data其实是主键)
GROUP BY (紧凑索引扫描)
  1. 检索获取到第一个叶子节点
  2. 通过叶子节点之间的底层指针遍历获取下一个叶子节点。
  3. 遇到相同的叶子节点,归为一组
参考链接
上一篇 下一篇

猜你喜欢

热点阅读