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

  • 相关阅读:
    了解大数据的特点、来源与数据呈现方式
    结对项目-四则运算 “软件”之升级版
    个人项目-小学四则运算 “软件”之初版
    大数据应用期末作业
    分布式文件系统HDFS 练习
    安装Hadoop
    爬虫大作业
    爬取全部的校园新闻
    理解爬虫原理
    中文词频统计与词云生成
  • 原文地址:https://www.cnblogs.com/gaogao67/p/12180325.html
Copyright © 2011-2022 走看看