• InnoDB数据页结构(2)之记录头信息解析


    InnoDB数据页结构之记录头信息解析

    前言

    之前聊了InnoDB数据页的结构由7部分组成,如下所示

    现在将以记录为切入点讲解,先来聊聊记录头信息,在用户记录中每条数据都包含一个记录头信息,以COMPACT行结构为例,结构图如下所示

    记录头用于描述记录信息,一般由5个字节40位构成,结构如下

    在之前的文章中有搭建过分析数据表详情参考InnoDB数据页结构(1)环境搭建

    表结构如下

    CREATE TABLE page_demo (
      c1 int(11) NOT NULL,
      c2 int(11) DEFAULT NULL,
      c3 varchar(10000) DEFAULT NULL,
      PRIMARY KEY (c1)
    ) ENGINE=InnoDB DEFAULT CHARSET=ascii ROW_FORMAT=COMPACT
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    表数据如下

    +----+------+------+
    | c1 | c2   | c3   |
    +----+------+------+
    |  1 |  100 | aaaa |
    |  2 |  200 | bbbb |
    |  3 |  300 | cccc |
    |  4 |  400 | dddd |
    +----+------+------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    根据测试表page_demo能够得到ibd文件如下分析信息

    .......省略部分信息
    0000c050  00 02 00 f2 00 00 00 68  00 00 00 02 00 32 01 00  |.......h.....2..|
    0000c060  02 00 1c 69 6e 66 69 6d  75 6d 00 05 00 0b 00 00  |...infimum......|
    0000c070  73 75 70 72 65 6d 75 6d  04 00 00 00 10 00 20 80  |supremum...... .|
    0000c080  00 00 01 00 00 00 00 8f  4e bb 00 00 01 31 01 10  |........N....1..|
    0000c090  80 00 00 64 61 61 61 61  04 00 00 00 18 00 20 80  |...daaaa...... .|
    0000c0a0  00 00 02 00 00 00 00 8f  4e bb 00 00 01 31 01 1c  |........N....1..|
    0000c0b0  80 00 00 c8 62 62 62 62  04 00 00 00 20 00 20 80  |....bbbb.... . .|
    0000c0c0  00 00 03 00 00 00 00 8f  4e bb 00 00 01 31 01 28  |........N....1.(|
    0000c0d0  80 00 01 2c 63 63 63 63  04 00 00 00 28 ff 91 80  |...,cccc....(...|
    0000c0e0  00 00 04 00 00 00 00 8f  4e bb 00 00 01 31 01 34  |........N....1.4|
    0000c0f0  80 00 01 90 64 64 64 64  00 00 00 00 00 00 00 00  |....dddd........|
    .......省略部分信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    行格式简单分析

    以第一条记录为例分析,记录值如下所示

    +----+------+------+
    | c1 | c2   | c3   |
    +----+------+------+
    |  1 |  100 | aaaa |
    +----+------+------+
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在ibd文件中数值表示如下所示

    下面数值具体表示如下

    04 :变长字段长度列表,page_demo表中c3列为varchar类型字符集为ascii,所以c3列值为aaaa长度为4
    00 :NULL值列表,第一列没有NULL值所以都是0
    00 00 10 00 20 :记录头信息(固定5个字节)
    80 00 00 01 :row_id值,由于定义了c1为主键所以这里存放c1列的值1(int类型存放规则)
    00 00 00 00 8f 4e :transaction_id列的值(固定6个字节)
    bb 00 00 01 31 01 10 :roll_pointer列的值(固定7个字节)
    80 00 00 64 :c2列的值为64
    61 61 61 61 :c3列的值为aaaa
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    根据上面的推理很容易可以得到测试表page_demo4条记录的记录头信息如下所示

    第一列:00 00 10 00 20
    第二列:00 00 18 00 20
    第三列:00 00 20 00 20
    第四列:00 00 28 ff 91
    
    • 1
    • 2
    • 3
    • 4

    根据记录头的构成,将上面的记录由十六进制转换为二进制分析

    第一列:00000000 00000000 00010000 00000000 00100000
    第二列:00000000 00000000 00011000 00000000 00100000
    第三列:00000000 00000000 00100000 00000000 00100000
    第四列:00000000 00000000 00101000 11111111 10010001
    
    • 1
    • 2
    • 3
    • 4

    根据这些二进制数据,将数据按照记录头结构切分可以得到如下信息

  • 相关阅读:
    基于安卓大学生兼职APP设计与实现
    对象树和QDialog(对话框)
    Python PyQt 程序设置图标
    【沁恒 CH32V208 开发板免费试用】+ U盘/ SD NAND读写与多功能数码相框
    sqli-labs less9详解
    jvm-sandbox-repeater时间mock插件设计与实现
    大话设计模式之抽象工厂模式
    Qt Creator配置小技巧
    流式数据处理与高吞吐消息传递:深入探索Kafka技术的奥秘
    使用IntelliJ IDEA 2022.1.2版本进行maven的创建和基本的一些使用
  • 原文地址:https://blog.csdn.net/zzf1233/article/details/126275531