3、存储数据结构
2021-10-16 16:35:41 1 举报
MySQL存储数据结构
作者其他创作
大纲/内容
0x09 0x04
......
16KB
记录数
标识数据是否被删除1表示删除
NULL值列表 数据头信息 column1=value1 column2=value2 ... columnN=valueN
存放这一组数据区的相关属性信息
数据头
n_owned
数据页
column02的值
delete_mask
这行数据的类型0:普通类型1:B+树非叶子节点2:最小值数据3:最大值数据
文件头
1字节(bit位)
min_rec_mask
逆序存储
4字节
record_type
256个数据区
行溢出
没任何含义
多个数据行
存放特殊信息
事务ID
回滚指针用来进行事务回滚
空闲区域
插入一行数据空闲区域就会减少
.ibd文件
1字节
0x04 0x02 0x03
记录数据页的相对位置,通过B+Tree快速找到一个数据页将该数据页加载到内存后再根据二分法查找数据页中的记录信息
name、address、school是变长字段(VARCHAR)
heap_no
jack和xx_school值转为16进制分别为0x04、0x09(address为null,所以变长字段的长度列表里没有相关数据)
所有允许值为NULL的字段,都有一个二进制bit位的值
null值列表
FSP_HDR数据页
比如字段类型为VARCHAR(65532)、TEXT、BLOB等,也就是这一行数据的这个字段远超一个数据页的大小(16KB),这个时候会在那一页里存储这行数据,然后在那个字段中,仅仅包含一部分数据,同时包含一个20个字节的指针,指向了其他的一些数据页,数据页用链表串联起来,存放这个超大字段里的数据。这个过程叫做行溢出那些数据页叫做溢出页
cc
数据区 extent
第一组数据区
INODE数据页
隐藏字段
存放表空间和这一组数据区的属性
IBUF_BITMAP数据页
大小不固定
表空间结构
bit值,1:NULL,0:不为NULL
逆序存储长度为8个bit位的倍数,不足高位补0
数据头信息 column1=value1 column2=value2 ... columnN=valueN
因为每行记录的都有一个next_record指针 指向下一行 记录头信息和 真实数据 之间的位置。这个位置刚刚好,向左读取就是行描述相关信息,向右读取就是真实数据。正好对应变长字段长度列表
最大记录最小记录
1MB
1MB(16KB * 64 = 1024KB)
数据页目录
next_record
0x09 0x04 00000101 0000000000000000000010000000000000011001 00000000094C(DB_ROW_ID)00000000032D(DB_TRX_ID) EA000010078E(DB_ROL_PTR) 616161 636320 6262626262
56字节
行的唯一标识没有指定主键和唯一索引时,内部自动加一个ROW_ID作为主键
例子中address、gender、job、school允许为空并且gender和school字段不是null(1010)
加上隐藏字段
column01的值
变长字段的长度列表
B+树里每一层的非叶子节点里的最小值
数据页头
根据数据库字符集编码进行编码再存储到磁盘
16字节
13字节
3字节
a
26字节
当前这行数据在记录堆里的位置
存储不是null的字段
指向下一条数据的指针
0x02 0x03 0x01
数据区组
1、当前页的上一个数据页的位置和当前页的下一个数据页的位置,B+Tree的决定了叶子节点数据页之间以双向链表的方式组织2、当前数据页属于数据区等信息
bb
DB_ROLL_PTR
8字节
指向下一行数据头(记录头信息)和真实数据之间的位置
0101
数据页结构
行数据结构
XDES数据页
存放这一组数据页的insert buffer的数据信息
0x09 0x04 0101 0000000000000000000010000000000000011001 column1=value1 column2=value2 ... columnN=valueN
0x09 0x04 0101 0000000000000000000010000000000000011001 616161 636320 6262626262
逆序存储原因
文件尾部
预留位
连续的64个数据页
以上图第二条记录为例:指针指向的位置,往左找到变长字段列表是0x02 0x03 0x01,往右找到数据部分为 a bbb cc刚好从右到左长度分别为1 3 2,右边数据从左到右字符疮毒分别为 1 3 2 ,完美对接上
其他各组数据区
40个bit位
DB_TRX_ID
DB_ROW_ID
cccc
表空间有很多数据区组
举例:客户表5个字段插入“jack NULL m NULL xx_school“这一行数据
bbb
aaa
0x09 0x04 0101 0000000000000000000010000000000000011001 jack m xx_school
column0n的值
38字节
0 条评论
回复 删除
下一页