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


    准备测试环境:

    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字节数据,该数据用于标识下条记录的起始相对位置。
  • 相关阅读:
    vim tail
    范式
    $@疑点
    ^ $ 和 a z 字符匹配
    [导入]DataList编辑、更新、取消、删除、分页(分页控件AspNetPager.dll)
    [导入]用.net操作word
    导出文件
    [导入]总结:ADO.NET在开发中的部分使用方法和技巧
    读取DataTable中的数据,一行一行进行比较
    [导入]ASP.NET 数据访问类
  • 原文地址:https://www.cnblogs.com/gaogao67/p/12188728.html
Copyright © 2020-2023  润新知