概览
https://www.mubucm.com/doc/5X-MdVzKDKB
为什么innodb设计了“区”的概念
如果以页为单位来分配存储空间,B+树索引中同一层级的双向链表相邻的两个页之间的物理位置可能离得非常远,会导致遍历索引的时候,无法使用顺序I/O,所以引入了“区”的概念
为什么innodb设计了“碎片区”的概念
如果有些表的本身的记录数很少,例如业务配置类型的表,直接以“区”为单位分配存储空间,就会导致磁盘空间的浪费。所以mysql规定,当一个表占用的页数量超过 32 个页后,再申请磁盘空间就是以 区 为单位
XDES Entry (Extent Descriptor Entry)
为了方便管理这些区 innodb 设计了 一个称为 XDES Entry (Extent Descriptor Entry) 的结构。每一个区都对应着一个 XDES Entry 结构,这个结构记录了对应的区的一些属性
Segment ID
(8字节) 每一个段都有一个唯一的编号,用 ID 表示。 Segment ID 字段表示的就是该区所在的段,前提是该区已经被分配给某个段了,不然该字段的值没有意义。
List Node
(12 字节〉 这个部分可以将若干个 XDES Entry 结构串连成一个链表
State
(4字节),表示 区 的状态
需要强调的是,处于 FREE、FREE_FRAG 以及 FULL_FRAG 这 3 种状态的区都是独立的,算是直属于表空间;而处于 FSEG 状态的区是附属于某个段的
Page State Bitmap
(16 字节) ,这个部分共占用16字节,也就是 128 位。一个区默认有 64 个页,这 128 位被划分为 64 个部分,每个部分有 位,对应区中的一个页。比如
Page State Bitmap 部分的第1位和第2位对应着区中的第1个页面,第3位和第4位对应着区中的第2个页面….. 127 位和 128 位对应着区中的第 64 个页面.这 2 个位中的第 1 位表示对应的页是否是空闲的,第2位还没有用到.
List Base Node 链表基节点
链表基节点,用户保存表空间 XDES Entry 链表 和 索引段中的 XDES Entry 链表 的,头节点指针和尾结点指针
段的结构
参考资料
《mysql是怎样运行的》第9章 存放页面的大池子--InnoDB的表空间