以 MySQL 默认的存储引擎 InnoDB 为例

InnoDB 包含以下四种行格式

  • Compact
  • Redundant
  • Dynamic
  • Compressed

指定行格式

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称;

ALTER TABLE 表名 ROW_FORMAT=行格式名称;

示例:

创建一张表,指定行格式为 Compact

CREATE TABLE test_table (
c1 VARCHAR(10),
c2 VARCHAR(10) NOT NULL,
c3 CHAR(10),
c4 VARCHAR(10)
CHARSET=ascii ROW_FORMAT=COMPACT;

行格式类型

Compact

Compact 中一条完整的记录可以被分成 '记录的额外信息' 和 '记录的真实数据' 两部分

记录的额外信息

Compact 中记录的额外信息包含三类:变长字段长度列表、NULL 值列表、记录头信息

变长字段长度列表

MySQL 支持一些变长的数据类型 (VARCHAR),这些数据在存储时不仅要存储数据内容,还需要将占用的字节数存储起来

定长数据类型 (CHAR) 在以一些变长字符集储存数据时,由于储存长度为变长,所以也需要在该列表中存储其长度

在记录的开头部位就是各个变长字段占用的字节数,这些数据逆序存放

如果表中没有变长字段,就没有变长字段长度列表

NULL 值列表

NULL 值列表存储有表中所有 NULL 值,可以节约许多空间

值为 1 时,代表 NULL;值为 0 时,代表非 NULL。当位数不够整数个字节的时候,在高位补 0

所有数据逆序存放

如果表中没有允许储存 NULL 值的列,就没有 NULL 值列表

记录头信息

名称 大小 (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 表示下一条记录的相对位置

记录的真实数据

隐藏列

除了一些自定义列的数据外,MySQL 还会为每个记录默认添加一些隐藏列:

列名 是否必须 占用空间 (bit) 描述
DB_ROW_ID 6 行ID,唯一标识一条记录
DB_TRX_ID 6 事务ID
DB_ROLL_PTR 7 回滚指针

只有当用户没有指定主键,且表中没有 Unique 键时才会添加 DB_ROW_ID 作为主键

储存数据

当定长数据类型 (CHAR) 没有储存满时,剩下的位都由空格 (0x20) 填满

当使用变成字符集时,由于储存字节长度不一定,当占用字节数少的字符串变为占用字节数多的字符串时需要新开辟一个空间,会产生存储碎片

Redundant

记录的额外信息

字段长度偏移列表

Redundant 行格式会把该条记录中所有列 (包括隐藏列) 的长度信息都按照逆序存储到 '字段长度偏移列表' 中

储存的值为两个相邻数值的差值

所有数据逆序存放

记录头信息

名称 大小 (bit) 描述
预留位1 1 没有使用
预留位2 1 没有使用
delete_mask 1 标记该记录是否被删除
min_rec_mask 1 B+树的每层非叶子节点中的最小记录都会添加该标记
n_owned 4 表示当前记录拥有的记录数
heap_no 13 表示当前记录在页面堆的位置信息
n_field 10 表示记录中列的数量
1byte_offs_flag 1 标记字段长度偏移列表中每个列对应的偏移量是使用1字节还是2字节表示的
next_record 16 表示下一条记录的相对位置

记录的真实数据

存储数据

不管该列使用的字符集是什么,只要是使用 CHAR 类型,占用的真实数据空间就是该字符集表示一个字符最多需要的字节数和字符串长度

例如使用 utf8 字符集的 CHAR(10) 列占用的真实数据空间始终是 30 个字节

Dynamic & Compressed

MySQL 8.0 中默认的行格式为 Dymatic

这两个行格式与 Compact 只有在处理行溢出数据 (<- 点击查看) 时有不同:它们不会在记录真实数据处储存真实数据的前 768 个字节,而是把所有的字节都存储到其他页面中,并且只储存其他页面的地址

Compressed 与 Dymatic 不同的一点是它会采用压缩算法对页面进行压缩,以节省空间

MySQL 行格式的更多相关文章

  1. 转:MySQL Row Format(MySQL行格式详解)

    MySQL Row Format(MySQL行格式详解) --转载自登博的博客

  2. 【大白话系列】MySQL 学习总结 之 COMPACT 行格式的设计原理

    如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.回顾 MySQL 学习总结系列至此已经第七节了. 从大方向:我们已经学习了 MySQL 的架构设计.Inno ...

  3. Mysql之InnoDB行格式、数据页结构

    Mysql架构图 存储引擎负责对表中的数据的进行读取和写入,常用的存储引擎有InnoDB.MyISAM.Memory等,不同的存储引擎有自己的特性,数据在不同存储引擎中存放的格式也是不同的,比如Mem ...

  4. 14.9.2 Specifying the Row Format for a Table 指定 表的行格式

    14.9.2 Specifying the Row Format for a Table 指定 表的行格式 mysql> SHOW TABLE STATUS\G; *************** ...

  5. MySql 行转列 存储过程实现

    同学们在使用mysql的过程中,会遇到一个行转列的问题,就是把多条数据转化成一条数据 用多列显示. 方法1. 实现方式用下面的存储过程,表名对应的修改就行. BEGIN declare current ...

  6. Mysql 行存储的文件格式

    一.Mysql行存储的文件格式概述 InnoDB存储引擎有两种文件格式 Antelope:compact与redundant两种行记录格式 Barracuda:compress与dynamic两种行记 ...

  7. MySQL binlog格式解析

    MySQL binlog格式解析   binlog想必大家都不陌生,在主从复制或者某些情况下的数据恢复会用到.由于binlog是二进制数据,要查看一般都借助mysqlbinlog工具.这篇笔记分析了b ...

  8. MyISAM和InnoDB的行格式ROW_FORMAT

    MyISAM行存储 MyISAM有3种行存储格式:fixed / dynamic / compressed: 格式 说明 备注   fixed  只有当表不包含变长字段(varchar/varbina ...

  9. MySQL 行溢出数据

    MySQL 行溢出数据 MySQL 对一条记录占用的最大储存空间是有限制的,除了 BLOB 和 TEXT 类型之外,其他所有列 (不包括隐藏列和记录头信息) 占用的字节长度不能超过 65535 个字节 ...

随机推荐

  1. Noip刷题计划

    写在前面 去年也想刷10年NOIP来着..结果刷到13年就没动力了233... 今年一定要完成目标啊!! "愿你明日重生,醒时心存冬阳" 2018年 题目 首次得分 出错原因 考点 ...

  2. 【2019.8.15 慈溪模拟赛 T1】插头(plugin)(二分+贪心)

    二分 首先,可以发现,最后的答案显然满足可二分性,因此我们可以二分答案. 然后,我们只要贪心,就可以验证了. 贪心 不难发现,肯定会优先选择能提供更多插座的排插,且在确定充电器个数的情况下,肯定选择能 ...

  3. React中引用CSS样式的方法

    相对于html中引用css的三种方法,react中也有三种方法,一一相对: 1. 行内样式:直接在组件内部定义 <div style={{width:'20px',height:'30px'}} ...

  4. celery生产者-消费者

    Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具. 它是一个任务队列,专注于实时处理,同时还支持任务调度. celery解决了什么问题: 示例一: ...

  5. body标签添加ontouchstart属性

    之前看别人的代码,发现他的body标签添加ontouchstart属性.即 <body ontouchstart> 上网查了一下原因,记录一下: 这个操作是进行手机端兼容处理的,防止伪类: ...

  6. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 3

    18.3  PDO的安装 PDO随PHP 5.1版本发行,在PHP 5的PECL扩展中也可以使用.PDO需要PHP 5版本核心面向对象特性的支持,所以它无法在之前的PHP版本中运行.无论如何,在配置P ...

  7. IT兄弟连 Java语法教程 流程控制语句 控制循环结构2

    使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...

  8. 全网趣味网站分享:今日热榜/Pixiv高级搜索/win10激活工具/songtaste复活/sharesome汤不热替代者

    1.回形针手册 由科普类视频节目“回形针PaperClip”近期提出的一个实用百科工具计划,计划名称是回形针手册. 包含了当下科技,农业等等各行各业的各种相关信息,计划刚刚开始! 关于回形针手册的详细 ...

  9. Spring框架的相关介绍

    Spring是一个开源轻量级的框架,它的核心是控制反转(IOC)和面向切面编程(AOP). 作为业务层框架的spring能够很好地整合表现层跟持久层. IOC:将类的创建和依赖关系写到配置文件里,可以 ...

  10. win10启动telnet

    1.点击win菜单,点击设置图标 2.选择系统选项 3.选择应用与程序选项 4.拉到最下方,选择程序与功能 5.选择启用或关闭windows功能 6.下拉找到telnet客户端选项勾选