MySQL存储引擎-InnoDB数据页
MySQL一个数据页默认16kb,MySQL为了不同目的涉及了很多类型的数据页,如undo页、Change Buffer页等等。我们这里只关心存放数据的页,即索引(INDEX)页。一个数据页的存储空间大致被划分为7部分,分别为:
1、FIle Header 文件头 38字节
2、Page Header 页面头 56字节
3、Infimum + Supermum 页面中的最小记录和最大记录 26字节
4、User Records 用户记录 不确定
5、Free Space 空闲空间 不确定
6、Page Directory 页目录 不确定
7、File Trailer 文件尾 8字节
一、记录在页中的存储
在一个新生成的页中,没有User Records部分,每有记录插入,都会从Free Space部分申请一个记录大小,然后划分到User Records部分。当Free Space空间用完后,再有记录插入就需要申请新的页了。我们这里再创建一个示例表:
create table page_demo( c1 int, c2 int, c3 varchar(10000), primary key(c1) ) charset = ascii row_format = compact; insert into page_demo values(1,100,'aaaa'),(2,200,'bbbb'),(3,300,'cccc'),(4,400,'dddd');
这里我们使用 hexdump 命令来查看一下数据的存储格式。
我们使用表格和十进制数据来分析一下每行记录是怎么表示的。 因为该示例表有主键,因此没有隐藏列 rowid。注:int类型占4个字节。 保留个疑问,我们可以看到c2列就是 100、200、300、400的有符号整数。 但是c1列比较奇怪,这里可以验证和主键有关系。
正常列就是按照数字进行存储的。至于主键列是怎么存储的,此处保留一个问题。
行号 | 变长字段 | NULL值列表 | 记录头信息 | trx_id | roll_pointer | c1列 | c2列 | c3列 |
第一行 | 04 | 00 | 00 00 10 00 20 | 80 00 00 01 00 00 | 13 94 79 79 f0 00 00 | 01 72 01 10 | 80 00 00 64 | 61 61 61 61 |
第二行 | 04 | 00 | 00 00 18 00 20 | 80 00 00 02 00 00 | 13 94 79 79 f0 00 00 | 01 72 01 1c | 80 00 00 c8 | 62 62 62 62 |
第三行 | 04 | 00 | 00 00 20 00 20 | 80 00 00 03 00 00 | 13 94 79 79 f0 00 00 | 01 72 01 28 | 80 00 01 2c | 63 63 63 63 |
第四行 | 04 | 00 | 00 00 28 ff 91 | 80 00 00 04 00 00 | 13 94 79 79 f0 00 00 | 01 72 01 34 | 80 00 01 90 | 64 64 64 64 |