zoukankan      html  css  js  c++  java
  • MySQL InnoDB Engine--数据页存储和UPDATE操作

    继续上一个测试

    测试2:更新测试

    测试脚本:

    ## 更新C1列并导致数据变化
    UPDATE TB001 SET C1='BBBB01' WHERE ID='AA0001';
    ## 更新C1列但不导致数据变化
    UPDATE TB001 SET C1='BB0002' WHERE ID='AA0002';
    ## 更新C2列并导致数据变化
    UPDATE TB001 SET C2='CCCC03' WHERE ID='AA0003';
    ## 更新C2列但不导致数据变化
    UPDATE TB001 SET C2='CC0004' WHERE ID='AA0005';
    
    SELECT * FROM TB001;
    +--------+--------+--------+
    | ID     | C1     | C2     |
    +--------+--------+--------+
    | AA0001 | BBBB01 | CC0001 |
    | AA0002 | BB0002 | CC0002 |
    | AA0003 | BB0003 | CCCC03 |
    | AA0004 | BB0004 | CC0004 |
    +--------+--------+--------+

    叶子节点数据:

    ## 主键索引叶子节点数据
    06 06 06 00 00 10 00 27 41 41 30 30 30 31 00 00 00 00 05 4F 38 00 00 00 91 04 6C 42 42 42 42 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 52 3A 00 00 00 7C 03 D1 42 42 30 30 30 33 43 43 43 43 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 20 00 10 00 00 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 00 13 42 42 30 30 30 34 41 41 30 30 30 34 
    06 06 00 00 30 FF A5 42 42 42 42 30 31 41 41 30 30 30 31

    对比更新前后数据,发现:

    1、更新未造成数据变化的操作不会导致主键记录的"事务信息“和"回滚指针"发生变化(需更多测试以确认)

    2、当辅助索引记录被更新时,原索引记录会被表示未删除,4字节40bits的记录头信息中有1bit用来表示记录是否被删除。

    UPDATE记录AA0003产生的UNOD日志:

    ## 更新产生的UNDO日志
    日志结束位置:03 F6 
    INSERT操作标识: 1C (TRX_UNDO_UPD_EXIST_REC)
    事务中DML操作顺序:00
    表十六进制ID: 2B
    事务信息(更新前):00 00 00 00 05 41 
    未知信息:E0
    回滚指针(更新前):AE 00 00 00 70 01 2C 
    ID列长度:06
    ID列(更新前):41 41 30 30 30 33 (AA003)
    更新列数量:01 
    更新列编号: 04(主键00>事务信息01>回滚指针02>C1列03>C2列04) 
    更新列长度:06 
    更新列数据(更新前):43 43 30 30 30 33(CC0003)
    日志开始位置:03 D1

    主键索引数据页和UNDO数据页中数据:

    从上图可以发现:

    1、对应UPDATE操作,UNDO日志中仅记录主键列数据和修改列前镜像数据(修改前数据),未发生修改的列不会被记录。

    2、对应UPDATE操作,UNDO日志中会记录修改前的"事务信息"和"回滚指针信息",用于判断"当前版本"和寻找"上一版本"

  • 相关阅读:
    『原创』一个基于Win CE 5.0的Txt文件阅读器
    『原创』来电防火墙源码
    『转载』NetBeans开发J2ME手机程序之——文件浏览器
    c#文件分割与合并 part 2
    『原创』c#下的分词程序(准原创)
    『转载』在vs2008(2005)winform中,打开office文档
    『原创』老范的来电防火墙v1.0发布了(图文)
    『原创』手把手教你用c#做个Splash(启动屏幕)
    DLL简单示例
    虚函数与多态
  • 原文地址:https://www.cnblogs.com/gaogao67/p/12184336.html
Copyright © 2011-2022 走看看