以 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. Educational Codeforces Round 76 (Rated for Div. 2) A. Two Rival Students 水题

    A. Two Rival Students There are

  2. Batch Normalization、Layer Normalization、Instance Normalization、Group Normalization、Switchable Normalization比较

    深度神经网络难训练一个重要的原因就是深度神经网络涉及很多层的叠加,每一层的参数变化都会导致下一层输入数据分布的变化,随着层数的增加,高层输入数据分布变化会非常剧烈,这就使得高层需要不断适应低层的参数更 ...

  3. CSS旋转动画和动画的拼接

    旋转动画 第一个样式: @keyframes rotating { from { transform: rotate(0deg); } to { transform: rotate(360deg); ...

  4. java之逻辑运算符

    &-逻辑与    |-逻辑或    !-逻辑非    &&-短路与    ||-短路或    ^-逻辑异或 a b a&b a|b !a a^b a&& ...

  5. js实现addClass方法,classList与className有什么区别?

     壹 ❀ 引 Jquery中addClass与removeClass是两个使用高频的方法,对于为dom元素增删class类非常方便:但如果不用JQ,使用js怎么模拟它们呢?本文主要记录下自己的实现思路 ...

  6. IT兄弟连 HTML5教程 HTML语言的语法 2

    HTML颜色值的设置 大多数浏览器都支持颜色名集合,颜色值是一个关键字或一个RGB格式的数字,在网页中用得很多.仅仅有16种颜色名被W3C的HTML 4.0标准所支持,它们是:aqua.black.b ...

  7. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

  8. Node 之 Express 4x 骨架详解

    周末,没事就来公司加班继续研究一下Express ,这也许也是单身狗的生活吧. 1.目录结构: bin, 存放启动项目的脚本文件 node_modules, 项目所有依赖的库,以及存放 package ...

  9. C# read dll config

    public static SqlConnection GetSqlConnection() { Configuration myDllConfig = ConfigurationManager.Op ...

  10. Core源码(四)IEnumerable

    首先我们去core的源码中去找IEnumerable发现并没有,如下 Core中应该是直接使用.net中对IEnumerable的定义 自己实现迭代器 迭代器是通过IEnumerable和IEnume ...