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

  • 相关阅读:
    Excel求值表达式——太好用了
    CPU保护模式深入探秘
    用QT创建WINDOWS服务程序
    windows服务怎么向应用程序发消息(部署在同一台机,非SCOKET)
    TCP的流量控制和拥塞控制
    PHP:执行模型和内存模型
    Web API CSRF保护实现
    C#中易混淆的知识点
    字符串合并与拆分写法小结
    zabbix实现对磁盘动态监控
  • 原文地址:https://www.cnblogs.com/gaogao67/p/12180325.html
Copyright © 2011-2022 走看看