MySQL InnoDB Engine--数据页存储和INSERT操作

测试环境:

复制代码
MySQL 5.7.28 社区版
CentOS release 6.10

MySQL Undo参数配置:
innodb_undo_tablespaces = 1
innodb_default_row_format = dynamic
复制代码

测试1:插入测试

测试脚本:

## 创建测试表
CREATE TABLE `TB001` (
  `ID` VARCHAR(20) NOT NULL,
  `C1` VARCHAR(20) NOT NULL,
  `C2` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `IDX_C1` (`C1`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

## 第一次插入数据
INSERT INTO `TB001`(ID,C1,C2)VALUES('AA0001','BB0001','CC0001'),('AA0002','BB0002','CC0002'),('AA0003','BB0003','CC0003');

## 第二次插入数据
INSERT INTO `TB001`(ID,C1,C2)VALUES('AA0004','BB0004','CC0004');

## 查看数据
SELECT * FROM TB001;
+--------+--------+--------+
| ID     | C1     | C2     |
+--------+--------+--------+
| AA0001 | BB0001 | CC0001 |
| AA0002 | BB0002 | CC0002 |
| AA0003 | BB0003 | CC0003 |
| AA0004 | BB0004 | CC0004 |
+--------+--------+--------+

叶子节点数据:

## 主键索引叶子节点数据
06 06 06 00 00 10 00 27 41 41 30 30 30 31 00 00 00 00 05 41 AE 00 00 00 70 01 10 42 42 30 30 30 31 43 43 30 30 30 31 
06 06 06 00 00 18 00 27 41 41 30 30 30 32 00 00 00 00 05 41 AE 00 00 00 70 01 1E 42 42 30 30 30 32 43 43 30 30 30 32 
06 06 06 00 00 20 00 27 41 41 30 30 30 33 00 00 00 00 05 41 AE 00 00 00 70 01 2C 42 42 30 30 30 33 43 43 30 30 30 33 
06 06 06 00 00 28 FF 7B 41 41 30 30 30 34 00 00 00 00 05 46 B1 00 00 00 73 01 10 42 42 30 30 30 34 43 43 30 30 30 34

## 索引IDX_C1叶子节点数据
06 06 00 00 10 00 13 42 42 30 30 30 31 41 41 30 30 30 31 
06 06 00 00 18 00 13 42 42 30 30 30 32 41 41 30 30 30 32 
06 06 00 00 20 00 13 42 42 30 30 30 33 41 41 30 30 30 33 
06 06 00 00 28 FF B8 42 42 30 30 30 34 41 41 30 30 30 34

回滚指针算法:

由于上面配置文件中设置innodb_undo_tablespaces=1,因此实例只有一个undo文件
回滚指针:AE 00 00 00 70 01 10
70表示数据页,即第7*16+0=112页
01 10是页偏移量
第70页的位置
=112*16*1024=1835008(十进制)=1C0000(十六进制) 该指针指向位置1C 01 10(十六进制)

回滚日志数据:

日志结束位置:01 1E
INSERT操作标识: 0B (TRX_UNDO_INSERT_REC)
事务中DML操作顺序:00
表十六进制ID: 2B
主键ID列长:06 
主键ID列值:41 41 30 30 30 31 (AA0001)
日志起始位置:01 10

日志结束位置:01 2C
INSERT操作标识: 0B (TRX_UNDO_INSERT_REC)
事务中DML操作顺序:01
表十六进制ID: 2B
主键ID列长:06 
主键ID列值:41 41 30 30 30 32  (AA0002)
日志起始位置:01 1E 

日志结束位置:01 3A
INSERT操作标识: 0B (TRX_UNDO_INSERT_REC)
事务中DML操作顺序:02
表十六进制ID: 2B
主键ID列长:06 
主键ID列值:41 41 30 30 30 33   (AA0003)
日志起始位置:01 2C

日志结束位置:01 1E
INSERT操作标识: 0B (TRX_UNDO_INSERT_REC)
事务中DML操作顺序:00
表十六进制ID: 2B
主键ID列长:06 
主键ID列值:41 41 30 30 30 34 (AA0004)
日志起始位置:01 10

通过观察UNDO日志,可以发现:

1、对应INSERT操作,UNDO日志中仅记录主键列数据,不会记录其他列信息。

2、对应INSERT操作,UNDO日志中没有"回滚指针"信息,因为新增记录没有"上一版本"

3、对应INSERT操作,UNDO日志中记录操作表十六进制ID信息。

4、对应INSERT操作,UNDO日志中记录各DML操作的顺序(产生记录的顺序)。

原文地址:https://www.cnblogs.com/gaogao67/p/12180325.html