目录
⻚结构

分析过程:1.前面介绍了每个数据⻚默认为 16KB ,是操作系统"数据块" 4KB的整数倍,那么只要保证⻚的⼤⼩是操作系统"数据块" ⼤⼩的整数倍是不是也可以呢,答案是肯定的。2.MySQL提供了⼀个专⻔的系统变量来控制⻚的⼤⼩,可以通过系统变量 innodb_page_size 进⾏调整与查看,在调整⻚⼤⼩的时候需要保证设置的值是操作系统"数据块" 4KB的整数倍,从⽽保证通过操作系统和磁盘交互时"数据块"的完整性,不被分割或浪费,所以规定了innodb_page_size 可以设置的值,分别是 4096 、 8192 、 16384 、 32768 、 65536 ,对应 4KB 、 8KB 、 16KB 、 32KB 、 64KB解答问题:可以通过系统变量 innodb_page_size 进⾏调整与查看,但要保证设置的值是操作系统"数据块" 4KB的整数倍,MySQL规定 innodb_page_size 可以设置的值,分别是 4096 、8192 、 16384 、 32768 、 65536 ,对应 4KB 、 8KB 、 16KB 、 32KB 、 64KB
2.⻚都有哪些分类?我们需要重点学习哪种⻚?
解答问题:
(1)InnoDB在不同的使⽤场景定义多种不同类型的⻚,常⽤的有 数据⻚ 、 Undo Log ⻚ 、Change Buffer ⻚ 、 Extent Descriptor(XDES) ⻚ 、 InnoDB 段信息⻚ 等,每种⻚的数据结构都不相同,其中最需要我们关注的就是数据⻚,由于InnoDB中有个概念叫 "索引即数据",所以也叫做索引⻚。(2)不论哪种类型的⻚都具有⻚头(File Header)和⻚尾(File Trailer)两个信息
3.⻚头和⻚尾具体包含了哪些信息?
前置知识:
1.数据页是MySQL中定义的一个存储结构,也是保存数据行的容器
2.要讨论其结构的话,首先要明白的三个问题:
(1)数据页具有哪些属性? ---对数据页进行描述
(2) 数据页之间如何进行关联? ---通过双向链表连接每个页
当前区的最后一个页与后一个区的第一个页通过双向链表的方式关联
(3) 数据页中如何组织数据行
通过页主体的具体功能实现
解答问题:⻚头和⻚尾中包含的是⽤来描述⽂件相关的信息,如下图所示
1.⻚头 - File Header
(1)⻚号: FIL_PAGE_OFFSET 占⽤ 4Byte ,相当于⻚的⾝份证号,通过这个⻓度可以计算出每个InnoDB表中最多可以拥有 2^(4*8)-1约42亿 个⻚,表空间第⼀个⻚编号从0开始,之后的⻚号分别是1,2,3…依此类推,具体⻚的偏移量计算公式为:⻚号 * 每⻚⼤⼩;那么按照每个⻚默认16KB⼤⼩计算,⼀个表空间最⼤容量为 2^(4*8) * 16KB = 64TB ,这也是InnoDB表空间最⼤容量是64T的原因;
(2)上⼀⻚⻚号: FIL_PAGE_PREV
(3)下⼀⻚⻚号: FIL_PAGE_NEXT 多个⻚通过这两个信息组成双向链表,即使不同的⻚地址不连续,也可以通过链表连接
(4)表空间ID: FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID ,当前⻚属于哪个表空间
(5)⻚类型: FIL_PAGE_TYPE ,数据⻚对应的⻚类型是 FIL_PAGE_INDEX = 0x45BF(常量)
(6)最近⼀次修改的LSN: FIL_PAGE_LSN ,占⽤8Byte
(7)已被刷到磁盘的LSN: FIL_PAGE_FILE_FLUSH_LSN ,占⽤8B