InnoDB-B+树索引[一]
InnoDB知识点梳理
InnoDB逻辑存储结构
表空间:数据都存放在表空间之下
段:数据段,索引段,回滚段
区:由64个页组成
页:InnoDB磁盘管理的最小单位[数据页/Undo页等8种常见类型的页]
行:对应数据库中的一行记录
InnoDB的物理存储结构
InnoDB表由共享表空间[.ibd],日志文件组,表结构定义文件[.frm]组成
InnoDB的行记录格式
Compact行记录格式
Redundant行记录格式
至此,我们大概的了解到数据是如何存储在Innodb中的。
InnoDB数据页结构
File Header
重要属性:
FIL_PAGE_OFFSET
FIL_PAGE_PREV
FIL_PAGE_NEXT
FIL_PAGE_TYPE[0X45BF/0X0003]
Page Header
重要属性:
PAGE_N_DIR_SLOTS[槽数]
Infimun + Supremum Records[虚拟行]
User Records[实际行]
Free Space
Page Directory[页目录]用于定位页内的具体一条记录
File Trailer
页目录的逻辑图
在页内,通过Page_Directory二分查找得到一个槽位,如果该槽位的值不是要找的值的话,读取该槽位的记录中的下一个记录。
至此我们可以得到一个页中的一条记录。
PS:Innodb按照索引找到的是记录所在的页,而不是一条具体记录!!!
B+树介绍
B+树 [对于B+树的定义,目前存在一些异议,本文参考维基百科以及<<Mysql技术内幕Innodb存储引擎>>中的定义]是一种数据结构,InnoDB中的索引就是基于B+树实现的。
B+插入/删除节点
案例:https://www.cnblogs.com/nullzx/p/8729425.html
关联关系
InnoDB的页即为B+树中的叶节点,索引即为非叶节点,叶节点中包含了众多的记录。
以聚集索引为例,非叶节点中保存了子节点中主键最小记录及其对应的page地址。所有的非叶节点都相当于构成一层索引,从一个粗略的根页往下层查,逐步细化到某一个页。然后从一个页中尝试去获取一条对应的记录,查找过程类似下图: