show table status
show table status like tableName
可以查看指定表的基本信息,包括存储引擎
,行格式
等InnoDB中数据的存储是在磁盘上的,而数据处理的过程则在内存中.InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDb中页的大小一般为16KB
compact
,version 5.6 默认使用redundant
,dynamic
,version 5.7默认使用compressed
ROW_FORMAT
=行格式名称变长字段?度列表
+ NULL列表
+ 记录头信息
+ 列值
在mysql中,变长字段中存储多少字节的数据是不固定的,所以在存储时,需要将这些数据占用的字节数也存起来,所以这些变长字段
占用的存储空间分为两部分:
1.真正的数据内容
2.字段的长度
在compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位
,从而形成一个变长字段长度列表,各变长字段数据占用的字节数按照列的顺序逆序存放
.注意,如果某个字段内容为null,是不会放入这个列表中的.
字段的长度用1或2个字节表示,具体规则如下:
记录中允许为NULL的字段
,将实际为NULL的字段用1表示,实际不为NULL的字段用0表示,也是逆序存放
,每个允许为NULL的列用一个位
来表示,如果记录中所有的列都不允许为null,则null列表就不存在.5个字节
组成,也就是40个二进制位名称 | 大小(bit) | 描述 |
---|---|---|
预留位1 | 1 | 没有使用 |
预留位2 | 1 | 没有使用 |
delete_mask | 1 | 表示该记录是否被删除 |
min_rec_mask | 1 | B+树的每层非叶子节点中的最小记录都会添加该标记 |
n_owned | 4 | 表示当前记录拥有的记录数 |
heap_no | 13 | 表示当前记录在记录堆的位置信息 |
record_type | 3 | 表示当前记录的类型,0表示普通记录,1表示B+数非叶子节点记录,2表示最小记录,3表示最大记录 |
next_record | 16 | 表示下一条记录的相对位置 |
DB_ROW_ID
,DB_TRX_ID
,DB_ROLL_POINTER
,具体情况如下:列名 | 是否必须 | 占用空间 | 描述 |
---|---|---|---|
row_id | 否 | 6字节 | 行ID,当我们创建的表中没有明确指定主键,且表中没有unique修饰的列时,会自动创建这个列,用来唯一标识一条记录 |
transaction_id | 是 | 6字节 | 事务ID |
roll_pointer | 是 | 7字节 | 回滚指针 |
redundant行格式是MySQL5.0之前用的一种行格式,字段长度偏移列表
+ 记录头信息
+ 列值
redundant行格式会把记录中所有列
的长度信息都按照逆序
存储到字段长度偏移列表中.而且存储长度的方式是采用相邻数值的差值
来计算各个列值得长度
n_field
和1byte_offs_flag
CREATE TABLE record_format_demo (
c1 VARCHAR(10),
c2 VARCHAR(10) NOT NULL,
c3 CHAR(10),
c4 VARCHAR(10)
) CHARSET=ascii ROW_FORMAT=COMPACT;
INSERT INTO record_format_demo(c1, c2, c3, c4)
VALUES (‘aaaa‘, ‘bbb‘, ‘cc‘, ‘d‘),
(‘eeee‘, ‘fff‘, NULL, NULL);
插入了两条数据,这时只有一个索引页
通过查找 73 75 70 72 65 6D 75 6D 即supremum关键字,其后面的数据就是第一条数据的开始位置.又因为插入的第一条数据的最后一个列是d,对应的l6进制是64,可找到第一条数据的结束位置.然后再后面就是第二条数据的开始位置
第一条数据
01 03 04 00 00 00 10 00 2D 00 00 00 00 02 00 00 00 00 00 4B 09 A9 00 00 01 1D 01 10 61 61 61 61 62 62 62 63 63 20 20 20 20 20 20 20 20 64
第二条数据
03 04 06 00 00 18 FF C2 00 00 00 00 02 01 00 00 00 00 4B 09 A9 00 00 01 1D 01 1E 65 65 65 65 66 66 66
原文:https://www.cnblogs.com/Serenity1994/p/12512712.html