mysql alter engine_MySQL InnoDB Engine--数据页存储和ALTER TABLE操作

本文通过在MySQL 5.7环境下进行测试,详细解析了ALTER TABLE操作如何影响InnoDB存储引擎的数据页,包括添加NULL和非NULL列的情况。分析了主键索引叶子节点和数据页的变化,探讨了记录头信息、行偏移量、事务信息和回滚指针等在操作后的状态。
摘要由CSDN通过智能技术生成

测试环境:

MySQL 5.7.28社区版

CentOS release6.10MySQL Undo参数配置:

innodb_undo_tablespaces= 1innodb_default_row_format= dynamic

测试1:插入测试

测试脚本:

## 创建测试表

CREATE TABLE `TB001` (

`ID` varchar(20) NOT NULL,

`C1` varchar(20) NOT NULL,

PRIMARY KEY (`ID`),

KEY `IDX_C1` (`C1`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

## 第一次插入数据

INSERT INTO `TB001`(ID,C1)VALUES('AA0001','EE0001'),('AA0002','EE0002'),('AA0003','EE0003');

## 第二次插入数据

INSERT INTO `TB001`(ID,C1)VALUES('AA0004','EE0004');

主键索引叶子节点数据:

06 06 00 00 10 00 20 41 41 30 30 30 31 00 00 00 00 05 07 A7 00 00 00 69 01 10 45 45 30 30 30 31

06 06 00 00 18 00 20 41 41 30 30 30 32 00 00 00 00 05 07 A7 00 00 00 69 01 1E 45 45 30 30 30 32

06 06 00 00 20 00 20 41 41 30 30 30 33 00 00 00 00 05 07 A7 00 00 00 69 01 2C 45 45 30 30 30 33

06 06 00 00 28 FF 91 41 41 30 30 30 34 00 00 00 00 05 0C AA 00 00 00 6C 01 10 45 45 30 30 30 34

索引IDX_C1叶子节点数据:

06 06 00 00 10 00 13 45 45 30 30 30 31 41 41 30 30 30 31

06 06 00 00 18 00 13 45 45 30 30 30 32 41 41 30 30 30 32

06 06 00 00 20 00 13 45 45 30 30 30 33 41 41 30 30 30 33

06 06 00 00 28 FF B8 45 45 30 30 30 34 41 41 30 30 30 34

数据页和索引页存储为:

aba2661398f5843989ac1cbfdfd411d6.png

PS1:由于两次插入,记录AA004和记录(AA001--AA003)的事务信息不同,每条记录回滚指针都不同

PS2: 索引页上无事务信息和回滚指针

测试2:ALTER TABLE测试1

测试脚本:

ALTER TABLE TB001 ADD C2 INT;

主键叶子节点数据:

06 06 01 00 00 10 00 21 41 41 30 30 30 31 00 00 00 00 05 07 A7 00 00 00 69 01 10 45 45 30 30 30 31

06 06 01 00 00 18 00 21 41 41 30 30 30 32 00 00 00 00 05 07 A7 00 00 00 69 01 1E 45 45 30 30 30 32

06 06 01 00 00 20 00 21 41 41 30 30 30 33 00 00 00 00 05 07 A7 00 00 00 69 01 2C 45 45 30 30 30 33

06 06 01 00 00 28 FF 8D 41 41 30 30 30 34 00 00 00 00 05 0C AA 00 00 00 6C 01 10 45 45 30 30 30 34

索引IDX_C1叶子节点数据:

06 06 00 00 10 00 13 45 45 30 30 30 31 41 41 30 30 30 31

06 06 00 00 18 00 13 45 45 30 30 30 32 41 41 30 30 30 32

06 06 00 00 20 00 13 45 45 30 30 30 33 41 41 30 30 30 33

06 06 00 00 28 FF B8 45 45 30 30 30 34 41 41 30 30 30 34

数据页和索引页存储为:

91629636c334288185e70572d7906f81.png

对比发现,执行ALTER TABLE TB001 AD C2 INT操作后:

1、ALTER TABLE操作未导致主键索引记录的事务信息和回滚指针发生变化

2、新增C2列导致"行偏移量”新增一个字节来表示C2是否为NULL,01表示为NULL。

3、新增C2列未导致“记录列信息”发生变化,即"记录列"中无C2列对应的存储空间,因为C2列为NULL。

测试2:ALTER TABLE测试2

测试脚本:

ALTER TABLE TB001 ADD C3 INT NOT NULL DEFAULT 9999;

主键叶子节点数据:

06 06 01 00 00 10 00 25 41 41 30 30 30 31 00 00 00 00 05 07 A7 00 00 00 69 01 10 45 45 30 30 30 31 80 00 270F06 06 01 00 00 18 00 25 41 41 30 30 30 32 00 00 00 00 05 07 A7 00 00 00 69 01 1E 45 45 30 30 30 32 80 00 270F06 06 01 00 00 20 00 25 41 41 30 30 30 33 00 00 00 00 05 07 A7 00 00 00 69 01 2C 45 45 30 30 30 33 80 00 270F06 06 01 00 00 28 FF 81 41 41 30 30 30 34 00 00 00 00 05 0C AA 00 00 00 6C 01 10 45 45 30 30 30 34 80 00 27 0F

索引IDX_C1叶子节点数据:

06 06 00 00 10 00 13 45 45 30 30 30 31 41 41 30 30 30 31

06 06 00 00 18 00 13 45 45 30 30 30 32 41 41 30 30 30 32

06 06 00 00 20 00 13 45 45 30 30 30 33 41 41 30 30 30 33

06 06 00 00 28 FF B8 45 45 30 30 30 34 41 41 30 30 30 34

数据页和索引页存储为:

41cb73b6b4d81612e878e57244a06b18.png

对比发现,执行ADD C3 INT NOT NULL DEFAULT 9999操作后:

1、新增NOT NULL列后不会导致"行偏移量"信息发生变化

2、新增INT NOT NULL DEFAULT 9999列后会在“记录列信息”中增加4字节数据并存放9999的数值。

3、记录头信息最后16bits是记录下一条记录的相对位置,由于记录总长度变长,记录头信息最后一字节发生改变。

4、ALTER TABLE同样未导致"事务信息"和"回滚指针"发生变化

PS: 十六进制值"80 00 27 0F"转换为二进制为"1000000 00000000 00100111 00001111",第一为1表示正负值,后面的值"10011100001111"转换为10进制为9999。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值