zoukankan      html  css  js  c++  java
  • 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操作的顺序(产生记录的顺序)。

  • 相关阅读:
    UVA 11384 Help is needed for Dexter(问题转化 递归)
    UVA 11991 Easy Problem from Rujia Liu?(vector map)
    poj 2656 Unhappy Jinjin
    解析磁盘0号扇区数据
    树的非递归遍历
    iOS项目开发实战——使用同步请求获取网页源码
    单点登录cas常见问题(四)
    bzoj2115【WC2001】Xor
    最小化JavaScript代码
    quick-cocos2d-x教程9:实例之加上背景图片
  • 原文地址:https://www.cnblogs.com/gaogao67/p/12180325.html
Copyright © 2011-2022 走看看