​ InnoDB存储引擎和大多数数据库一样,记录是以行的形式存储的。这就意味着页中保存着表中一行行的数据。在InnoDB 1.0x版本之前,InnoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据。Redundant格式是为了兼容之前版本而保留的(mysql5.0版本之前InnoDB的行记录存储方式)。源码中使用PHYSICAL RECORD (NEW STYLE) 和PHYSICAL RECORD (OLD STYLE)来区分两种格式的。在mysql5.1版本中,默认设置为Compact行格式。可以通过命令SHOW TABLES STATUS LIKE ‘表名’ 来查看当前表使用的行格式,其中row_format属性表示当前所使用的行记录结构类型。

Compact行记录的设计目标是高效地存储数据。简单来说,一个页存放的行数据越多,其性能就越高。Compact行记录的存储方式如下:

从图中可以看出:

  1. Compact行记录格式的首部是一个非NULL变长字段长度列表,并且其是按照列的顺序逆序放置的,其长度为:

    • 若列的长度小于255字节,用1字节表示;
    • 若列长度大于255个字节,用2字节表示。

    变长字段的长度最大不可以超过2字节,这是因为在mysql数据库中VARCHAR类型的最大长度限制为65535。

  2. NULL标志位,指示了该行数据中是否有NULL值,有则用1表示;

  3. 记录头信息,固定占用5字节(40位),每位的含义如下:

  4. 最后的部分就是实际存储每个列的数据。

注:

  • NULL不占该部分任何空间,即除了占有NULL标志位,实际存储不占有任何空间
  • 每个数据行除了用户定义的列外。还有两个隐藏列,事务ID列和回滚指针列,分别为6字节和7字节大小
  • InnoDB 表没有定义主键,每行还会增加一个6字节的rowid列

接下来会用一个具体的示例来分析Compact行记录的内部结构:

CREATE TABLE `mytest` (
`t1` varchar(10) DEFAULT NULL,
`t2` varchar(10) DEFAULT NULL,
`t3` char(10) DEFAULT NULL,
`t4` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;

插入三条数据:

mysql> select * from mytest;
+------+------+------+------+
| t1 | t2 | t3 | t4 |
+------+------+------+------+
| a | bb | bb | ccc |
| d | ee | ee | fff |
| d | NULL | NULL | fff |
+------+------+------+------+

打开表空间文件mytest.ibd,内容如下:

该行记录从0000c078开始(第一行)

03 02 01 /*变长字段长度列表,逆序*/
00 /*NULL标志位,第一行没有NULL值*/
00 00 10 00 2C/*Record Header,固定5字节长度*/
00 00 00 2B 68 00/*RowID InnoDB自动创建,6字节*/
00 00 00 00 06 05/*TransactionID*/
80 00 00 00 32 01 10/*Roll Pointer*/
61/*列1数据 'a' */
62 62/*列2数据 'bb' */
62 62 20 20 20 20 20 20 20 20/*列3数据 'bb' */
63 63 63/*列4数据 'ccc' */

首先变长字段是逆序的,因此变长字段长度列表为 03 02 01,而不是01 02 03。可以看到,固定长度CHAR字段在未能完全占用其长度空间时,会用0x20来进行填充。

Rocord Header的最后两个字节next_recorder,0x2c代表下一个记录的偏移量,即当前记录的位置加上偏移量0x2c就是下一条记录的起始位置。所以InnoDB引擎在页内部是通过一种链表的结构来串联各个行记录的。

有NULL值得第三行:

03 01 /*变长字段长度列表,逆序*/
06 /*NULL标志位,第一行没有NULL值*/
00 00 20 ff 98/*Record Header,固定5字节长度*/
00 00 00 2b 68 00/*RowID InnoDB自动创建,6字节*/
00 00 00 00 06 07/*TransactionID*/
80 00 00 00 32 01 10/*Roll Pointer*/
64/*列1数据 'a' */
66 66 66/*列4数据 'fff' */

第三行有NULL值,因此NULL表示为不再是00 而是06,转成二进制位00000110,为1的值代表第2列和第3列的数据为NULL。可以发现,第三行只存储了第1列和第4列非NULL的值。

与Redundant行记录格式相比:
不管是CHAR类型还是VARCHAR类型,在Compact格式下NULL值都是不占用任何存储空间的。
对于VARCHAR类型的NULL值,Redudant行记录格式同样不会占用任何存储空间,而CHAR类型的NULL值需要占用空间。

Compact行记录相关推荐

  1. mysql学习-Innodb行格式compact行记录解析

    前言 了解行结构的意义: 知道设置好的主键可以节省空间 知道char的大小设置错误还不如varchar 知道字符集对变长字段类型的影响 知道null 和 空串的区别 还有一些-我还没发现 Compac ...

  2. Mysql compact行格式

    InnoDB行格式类型(Compact格式) Compact行格式示意图: Mysql中变长字段是如何存储的 mysql支持变长的数据类型,varchar(m).varbinary(m).text.b ...

  3. compact mysql_mysql中compact行的存储结构

    mysql中行的格式类型包括:Compact.redundant.dynamic.compressed这四种,行和行之间是通过一个单向链表的形式来连接的,而我在实际工作中最常用到的是compact类型 ...

  4. MySQL如何存储数据?(InnoDB的Compact行格式)

    文章目录 1. 概要 2. compact行格式 2.1 示意图 2.2 记录的额外信息 2.2.1 变长字段长度列表 2.2.2 NULL值列表 2.2.3 记录头信息 2.2.4 记录的真实数据 ...

  5. MySQL原理 - InnoDB引擎 - 行记录存储 - Compact 行格式

    MySQL 服务器上负责对表中数据的读取和写入工作的部分是存储引擎,比如 InnoDB.MyISAM.Memory 等等,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,目前OLTP业务的表如 ...

  6. (转)分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)...

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  7. Mysql INSERT INTO .. ON DUPLICATE KEY更新多行记录

    1.  如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导 ...

  8. easyui treegrid idField 所在属性中值有花括号(如Guid)当有鼠标事件时会报错,行记录一下...

    easyui treegrid idField 所在属性中值有花括号(如Guid)当有鼠标事件时会报错,行记录一下 转载于:https://www.cnblogs.com/xiaoruilin/p/6 ...

  9. Oracle 多行记录合并/连接/聚合字符串的几种方法

    怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结. - 什么是合并多行字符串(连接字符串)呢,例如: 1 S ...

最新文章

  1. java反序列化weblogic_[Todo]Java反序列化-weblogic
  2. 报名 | 中小微企业如何转型升级?腾讯CSIG沙龙直播分享数字化发展新思路
  3. 浅谈视觉设计的准确性
  4. Windows Server 2012和Windows 8中的远程管理
  5. 【转】1.2异步编程:使用线程池管理线程
  6. Solr router 路由介绍
  7. JavaScript 如何打败众语言,成为 Node 的实现语言?
  8. sqlserver随机取记录
  9. IDEA 插件 Material Theme UI收费后 免费的办法
  10. Tensor Flow V2:将Tensor Flow H5模型文件转换为tflite
  11. linux mongo 搭建+集群
  12. 赴日游个人签证门槛降低 年薪3万可申请
  13. 串口转WiFi透传模块UART转WiFi模块嵌入式WiFi参数一键配置原理
  14. 执行python manage.py migrate报错问题解决
  15. 20135203齐岳 信息安全系统设计基础第四周学习总结
  16. Ubuntu 22.10安装搜狗输入法教程
  17. eversync safari_Eversync:书签同步插件
  18. 腾讯云CDB/CynosDB技术揭秘
  19. 《云端软件平台》运行机制浅析
  20. 合并k个排序链表(Python实现)

热门文章

  1. db2 EXPLAIN分析SQL
  2. Win10下载Ubuntu Linux虚拟机设置管理员名称时无法通过NAME_REGEX的检查,--force-badname也无法通过
  3. python实现批量注册网站用户
  4. 春节消费观察:四种愉悦感,抓住女人心
  5. Chrome 浏览器 原生工具进行网页长截图
  6. 日语五十音图的记忆方法
  7. 智能餐厅摆动手势点餐人脸识别支付
  8. centos 7.6 ——远程访问及控制——(ssh密钥登录、ssh客户端、TCP Wrappers)
  9. 索尼xz Android 内存,新版索尼Xperia XZ曝光:终于迈入4GB内存时代!
  10. Linux花开五洲,争奇斗艳