innodb存储引擎之:表空间

概览

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的表空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值