MySQL 行格式
以 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 行格式的更多相关文章
- 转:MySQL Row Format(MySQL行格式详解)
MySQL Row Format(MySQL行格式详解) --转载自登博的博客
- 【大白话系列】MySQL 学习总结 之 COMPACT 行格式的设计原理
如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.回顾 MySQL 学习总结系列至此已经第七节了. 从大方向:我们已经学习了 MySQL 的架构设计.Inno ...
- Mysql之InnoDB行格式、数据页结构
Mysql架构图 存储引擎负责对表中的数据的进行读取和写入,常用的存储引擎有InnoDB.MyISAM.Memory等,不同的存储引擎有自己的特性,数据在不同存储引擎中存放的格式也是不同的,比如Mem ...
- 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; *************** ...
- MySql 行转列 存储过程实现
同学们在使用mysql的过程中,会遇到一个行转列的问题,就是把多条数据转化成一条数据 用多列显示. 方法1. 实现方式用下面的存储过程,表名对应的修改就行. BEGIN declare current ...
- Mysql 行存储的文件格式
一.Mysql行存储的文件格式概述 InnoDB存储引擎有两种文件格式 Antelope:compact与redundant两种行记录格式 Barracuda:compress与dynamic两种行记 ...
- MySQL binlog格式解析
MySQL binlog格式解析 binlog想必大家都不陌生,在主从复制或者某些情况下的数据恢复会用到.由于binlog是二进制数据,要查看一般都借助mysqlbinlog工具.这篇笔记分析了b ...
- MyISAM和InnoDB的行格式ROW_FORMAT
MyISAM行存储 MyISAM有3种行存储格式:fixed / dynamic / compressed: 格式 说明 备注 fixed 只有当表不包含变长字段(varchar/varbina ...
- MySQL 行溢出数据
MySQL 行溢出数据 MySQL 对一条记录占用的最大储存空间是有限制的,除了 BLOB 和 TEXT 类型之外,其他所有列 (不包括隐藏列和记录头信息) 占用的字节长度不能超过 65535 个字节 ...
随机推荐
- [Pytorch Bug] "EOFError: Ran out of input" When using Dataloader with num_workers=x
在Windows上使用Dataloader并设置num_workers为一个非零数字,enumerate取数据时会引发"EOFError: Ran out of input"的报错 ...
- autojump--懒人利器
只有打开过的目录 autojump 才会记录,所以使用时间越长,autojump 才会越智能. 可以使用 autojump 命令,或者使用短命令 j. 跳转到指定目录 j directoryName ...
- swoole client有什么用
PHP常用socket创建TCP连接,使用CURL创建HTTP连接,为了简化操作,Swoole提供了Client类用于实现客户端功能,并增加了异步非阻塞模式,让用户在客户端也能使用事件循环. 作为客户 ...
- IT兄弟连 HTML5教程 HTML语言的语法 1
HTML是文本类型的语言,和其他任何一门语言相比,语法都是最简单的.但在编写HTML文件时,必须遵循HTML的语法规则.一个完整的HTML文件由标题.段落.列表.表格.文本,即嵌入的各种对象所组成,这 ...
- 《细说PHP》第四版 样章 第二章 PHP的应用与发展 1
<细说PHP>第四版 样章 第二章 PHP的应用与发展 1 学习任何编程语言之前,先了解一下它的应用与发展是很有必要的.从Web开发的历史看来,PHP.Python和Ruby几乎是同时出现 ...
- IT兄弟连 HTML5教程 HTML5和HTML的关系
HTML5开发现在很火爆,是一门技术,更是一个概念.可以让我们的工作模式.交互模式以及对应用和游戏的体验有了翻天覆地的变化,很多人都知道HTML5这门技术,也常把HTML5读作H5(简称).其实一些外 ...
- Long类型数据前端精度丢失
问题描述 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况.例如:201511200001725439这样一个Long类型的整数,传给前端后会变成201511200001725440 相 ...
- virtualbox FAIL(0x80004005) VirtualBox VT-x is not available (VERR_VMX_NO_VMX)
virtualbox启动虚拟机报错: FAIL(0x80004005) VirtualBox VT-x is not available (VERR_VMX_NO_VMX),无法创建新任务 这是win ...
- 数据库相关知识积累(sqlserver、oracle、mysql)
数据库相关知识积累(sqlserver.oracle.mysql) 1. sqlserver :断开所有连接: (还原数据库) 1.数据库 分离 2. USE master GO ALTER DAT ...
- 基于 EntityFramework 生成 Repository 模式代码
借助 WeihanLi.EntityFramework 实现简单的 Repository Intro 很多时候一些简单的业务都是简单的增删改查,动态生成一些代码完成基本的增删改查,而这些增删改查代码大 ...