码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2020-01-13 20:11:27      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:into   set   _for   select   删除   font   prim   har   点数据   

准备测试环境:

MySQL 5.7.28 社区版
CentOS release 6.10

MySQL Undo参数配置:
innodb_undo_tablespaces = 1
innodb_default_row_format = dynamic

准备测试数据:

## 创建测试表
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);


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

测试操作:

## 将C2列值长度从6扩展至8
UPDATE TB001 SET C2=CC000111 WHERE ID=AA0001;
## 将C2列值长度从6缩短至4
UPDATE TB001 SET C2=CC03 WHERE ID=AA0003;

更新前叶子节点数据:

06 06 06 00 00 10 00 27 41 41 30 30 30 31 00 00 00 00 05 78 D3 00 00 00 A6 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 78 D3 00 00 00 A6 01 1E 42 42 30 30 30 32 43 43 30 30 30 32 
06 06 06 00 00 20 FF A2 41 41 30 30 30 33 00 00 00 00 05 78 D3 00 00 00 A6 01 2C 42 42 30 30 30 33 43 43 30 30 30 33

更新后叶子节点数据:

06 06 06 00 00 10 00 00 41 41 30 30 30 31 00 00 00 00 05 78 D3 00 00 00 A6 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 78 D3 00 00 00 A6 01 1E 42 42 30 30 30 32 43 43 30 30 30 32 
04 06 06 00 00 20 FF A2 41 41 30 30 30 33 00 00 00 00 05 80 58 00 00 00 AA 01 10 42 42 30 30 30 33 43 43 30 33 30 33 
08 06 06 00 00 28 FF B2 41 41 30 30 30 31 00 00 00 00 05 7E 57 00 00 00 A9 01 10 42 42 30 30 30 31 43 43 30 30 30 31 31 31

前后数据对比:

技术图片

对比观察发现:

1、将C2列值长度从6扩展至8,导致记录总长度增大,当前记录前后无空闲空间,采用"DELETE+INSERT"方式:
    A、将"原记录"标识为删除。
    B、在页空闲区域"新增"一条更新后记录。

2、将C2列值长度从6缩减至4,导致记录总长度缩小,可以直接在当前记录上进行修改,采用"UPDATE"方式:    
    A、将"CC0003"的前四字节改为"CC03",后两字节不变。
    B、将行偏移量从6改为4,限制读取前4字节数据,后两字节不会被"使用"

PS: 记录头信息5字节40bits中的第3bit用来标识记录是否删除,但在上面“删除记录”中,仅修改记录头信息最后2字节数据,该数据用于标识下条记录的起始相对位置。

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

标签:into   set   _for   select   删除   font   prim   har   点数据   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!