一. 行记录格式 innodb在存储数据的时候是以行的形式存储的,版本相关,并且有固定的格式。可以通过下面的语句查询当前所用版本的行记录格式: show table status like ‘表名‘; 在版本5.6中默认使用格式是Com
innodb在存储数据的时候是以行的形式存储的,版本相关,并且有固定的格式。可以通过下面的语句查询当前所用版本的行记录格式:
show table status like ‘表名‘;
在版本5.6中默认使用格式是Compact,而在8.0中默认的格式是Dynamic。本文描述的是Compact格式下的行记录。版本查询可以使用语句‘select version();’。
Compact格式是5.0引入的,目的是为了高效存储数据。其存储方式如下:
变长字段长度列表 |
NULL标志位 |
记录头信息 |
列1数据 |
列2数据 |
... |
1、变长字段长度列表,注意断句为变长字段-长度-列表。
a) 其描述了行记录中存储内容长度不固定的字段所占用的字节数
b) 按照列的顺序逆序存放
c) 若列的长度小于255个字节,则用一个字节描述
d) 若列的长度大于255个字节,则用两个字节描述
e) 变长字段的长度不能大于65535个字节,所以,最多用两个字节描述其长度:2^16=65536。
NULL标志位指示该行数据中是否有null值,有则用1表示,占用1个字节(占用一个字节是书里写的,但是实验下来发现也并非如此,对于书里的内容还是不能全信啊)。
记录头信息如下图所示:
数据列
5、两个隐藏列:事务ID和回滚指针
a) 事务ID:占用6个字节,描述最新更新该行的事务的ID
b) 回滚指针:占用7个字节,指向undo log链,用于回滚和mvcc
6、没有主键,每行回增加一个6字节的rowid列
现在通过一个表来具体看一下某一行在底层的存储内容,建表语句及插入数据如下所示:
create table mytest(
t1 varchar(10),
t2 varchar(10),
t3 char(10),
t4 varchar(10)
)engine=innodb charset=latin1 row_fORMat=compact;
insert into mytest
values
(‘a‘, ‘bb‘,‘bb‘,‘ccc‘),
(‘d‘,‘ee‘,‘ee‘,‘fff‘),
(‘d‘, null, null, ‘fff‘);
通过vscode打开数据表的存储文件mytest.ibd,找到数据记录存储的位置,如下所示:
通过分析其二进制内容,找到第一行记录的位置,分析其内容如下:
03 02 01
00
00 00 10 00 2C
00 00 00 00 02 00
00 00 00 00 05 50
B7 00 00 01 2B 01 10
61
62 62
62 62 20 20 20 20 20 20 20 20
63 63 63
从上面可以看到,变长字段长度列表是逆序的,char字段未使用的位会用0x20(空格)表示。
第三条记录的二进制表示如下:
03 01
06
00 00 20 FF 98
00 00 00 00 02 02
00 00 00 00 05 50
B7 00 00 01 2B 01 2C
64
66 66 66
Mysql innodb引擎中varchar和char的区别
--结束END--
本文标题: mysql innodb引擎中varchar和char的区别
本文链接: https://www.lsjlt.com/news/8072.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-14
2024-05-14
2024-05-14
2024-05-14
2024-05-14
2024-05-13
2024-05-13
2024-05-13
2024-05-13
2024-05-12
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0