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操作的顺序(产生记录的顺序)。

  • 相关阅读:
    入门MyBatis框架你一点都不需要慌
    手把手教你玩转Git
    小米商城项目(JSP+Servlet项目)
    超详细Maven技术应用指南
    如何深入理解关系型数据库的三大范式
    MySQL触发器的详细教学与实战分析
    cute-cnblogs 番外篇-自定义博客园样式美化
    2019以终为始,不迷茫的2020 | 前端小菜鸡的年度总结~
    可爱的博客园样式之自定义“评论区”样式
    Vue中使用key的作用
  • 原文地址:https://www.cnblogs.com/gaogao67/p/12180325.html
Copyright © 2011-2022 走看看