【mysql是怎样运行的】-InnoDB行格式

本文介绍了MySQL中不同的行格式,特别是COMPACT格式的详细结构,包括变长字段长度列表、NULL值列表、记录头信息和记录的真实数据部分。动态(Dynamic)和压缩(Compressed)行格式处理行溢出数据的方式与COMPACT不同,Dynamic成为MySQL8.0的默认行格式。
摘要由CSDN通过智能技术生成

1 指定行格式的语法
CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称
2 COMPACT行格式

在MySQL 5.1版本中,默认设置为Compact行格式。一条完整的记录其实可以被分为记录的额外信息和记录的真实数据两大部分。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9rpdPtuN-1677916120275)(null)]

2.1 变长字段长度列表

MySQL支持一些变长的数据类型,比如VARCHAR(M)、VARBINARY(M)、TEXT类型,BLOB类型,这些数据类型修饰列称为变长字段,变长字段中存储多少字节的数据不是固定的,所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来。在Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表。

变长字段长度列表中只存储值为非 NULL 的列的内容长度,不存储值为 NULL 列的内容长度。

注意:这里面存储的变长长度和字段顺序是反过来的。比如两个varchar字段在表结构的顺序是a(10),b(15)。那么在变长字段长度列表中存储的长度顺序就是15,10,是反过来的。

InnoDB有它的一套规则.为了更好地表述清楚这个规则,我们引入W、M、L几个符号,先分别看看这些符号的意思

  • 假设某个字符集中最多需要W字节来表示一个字符(也就执行 SHOW CHARSET句后结果中的 Maxlen 列) ,比如utf8mb4字符集中的W就是4 utf8mb3字符集中的W就是3gbk字符集中的W就是2ascii字符集中的W就是1
  • 对于变长类型 VARCHAR(M)。这种类型表示能存储最多M个字符(注意是字符不是字节) 所以这种类型能表示字符串最多占用的字节数就是M×W
  • 假设该变长字段实际存储的字符串占用的字节数是L

确定使用1字节还是2字节来表示一个变长字段的真实数据占用的字节数的规则就是这样:
如果M×W≤255 ,最多存储小于255字节,那么使用1字节来表示真实数据占用的字节数.
如果M×W≥255 ,最多存储大于255字节,则分为下面两种情况:
如果L≤127,则用1字节来表示实际真实数据占用的字节数
如果L≥127 ,则用2字节来表示实际真实数据占用的字节数

总结下就是:如果该变长字段允许存储的最大字节数(M×W) 超过 255 字节,并且真实数据占用的字节数(L)超过127字节,则使用2字节来表示真实数据占用的字节数,否则使用1字节.

c1、c2、c4列 --》 04、03、01,c2列是null不存放在变长字段列表
在这里插入图片描述
逆序存放如下
在这里插入图片描述

2.2 NULL值列表

Compact行格式会把可以为NULL的列统一管理起来,存在一个标记为NULL值列表中。如果表中没有允许存储 NULL 的列,则 NULL值列表也不存在了。
为什么定义NULL值列表?
之所以要存储NULL是因为数据都是需要对齐的,如果没有标注出来NULL值的位置,就有可能在查询数据的时候出现混乱。如果使用一个特定的符号放到相应的数据位表示空值的话,虽然能达到效果,但是这样很浪费空间,所以直接就在行数据得头部开辟出一块空间专门用来记录该行数据哪些是非空数据,哪些是空数据,格式如下:

  1. 二进制位的值为1时,代表该列的值为NULL。
  2. 二进制位的值为0时,代表该列的值不为NULL。

注意:同样顺序也是反过来存放的

如果c1、c3、c4允许为NUL的列,所以这3个列和二进制位的对应关系如图所示,并且还是逆序存放
在这里插入图片描述
MySQL 规定 NULL 值列表必须用整数个字节的位表示,如果使用的二进制位个数不足整数个字节,则在字节的高位补0。
如果1个表中有9个值允许为 NULL 的列,则这个记录的 NULL 值列表部分
就需要2字节(1字节8比特)来表示了.

2.3 记录头信息(5字节)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LpC8QrW6-1677916117839)(https://cdn.jsdelivr.net/gh/aoshihuankong/cloudimg@master/img/202203301945235.png)]

名称大小(单位:bit)描述
预留位11没有使用
预留位21没有使用
delete_mask1标记该记录是否被删除
mini_rec_mask1B+树的每层非叶子节点中的最小记录都会添加该标记
n_owned4一个页面中的记录会被分成若干个组,每个组中有一个记录是"带头大哥”,其余的记录都是"小弟"。带头大哥记录的 n_owned代表该组中所有的记录条数,"小弟"记录的n_owned 值都为 0
heap_no13表示当前记录在记录堆的位置信息
record_type3表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录
next_record16表示下一条记录的相对位置
  • delete_mask:这个属性标记着当前记录是否被删除,占用1个二进制位。
    • 值为0:代表记录并没有被删除
    • 值为1:代表记录被删除掉了

被删除的记录为什么还在页中存储呢?
你以为它删除了,可它还在真实的磁盘上。这些被删除的记录之所以不立即从磁盘上移除,是因为移除它们之后其他的记录在磁盘上需要重新排列,导致性能消耗。所以只是打一个删除标记而已,所有被删除掉的记录都会组成一个所谓的垃圾链表,在这个链表中的记录占用的空间称之为可重用空间,之后如果有新记录插入到表中的话,可能把这些被删除的记录占用的存储空间覆盖掉。

  • min_rec_mask:B+树的每层非叶子节点中的最小记录都会添加该标记,min_rec_mask值为1。我们自己插入的四条记录的min_rec_mask值都是0,意味着它们都不是B+树的非叶子节点中的最小记录。
  • record_type:这个属性表示当前记录的类型,一共有4种类型的记录:
    • 0:表示普通记录
    • 1:表示B+树非叶节点记录
    • 2:表示最小记录
    • 3:表示最大记录
  • heap_no:这个属性表示当前记录在本页中的位置。

怎么不见heap_no值为0和1的记录呢
MySQL会自动给每个页里加了两个记录,由于这两个记录并不是我们自己插入的,所以有时候也称为伪记录或者虚拟记录。这两个伪记录一个代表最小记录,一个代表最大记录。最小记录和最大记录的heap_no值分别是0和1,也就是说它们的位置最靠前

  • n_owned:页目录中每个组中最后一条记录的头信息中会存储该组一共有多少条记录,作为 n_owned 字段
  • next_record:记录头信息里该属性非常重要,它表示从当前记录的真实数据到下一条记录的真实数据的地址偏移量
2.4 记录的真实数据

记录的真实数据除了c1 、c2、c3、c4 这几个我们自己定义
的列的数据外. MySQL 会为每个记录默认地添加一些列(也称为隐藏列如下)

列名是否必须占用空间描述
row_id6字节行ID,唯一标识一条记录
transaction_id6字节事务ID
roll_pointer7字节回滚指针

一个表没有手动定义主键,则会选取一个Unique键作为主键,如果连Unique键都没有定义的话,则会为表默认添加一个名为row_id的隐藏列作为主键。所以row_id是在没有自定义主键以及Unique键的情况下才会存在的。

3 Dynamic和Compressed行格式

我们可以知道一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65533个字节,这样就可能出现一个页存放不了一条记录,这种现象称为行溢出

在Compact和Reduntant行格式中,对于占用存储空间非常大的列,在记录的真实数据处只会存储该列的一部分数据,把剩余的数据分散存储在几个其他的页中进行分页存储,然后记录的真实数据处用20个字节存储指向这些页的地址(当然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数),从而可以找到剩余数据所在的页。这称为页的扩展

在MySQL 8.0中,默认行格式就是Dynamic,Dynamic、Compressed行格式和Compact行格式挺像,只不过在处理行溢出数据时有分歧

  • Compressed和Dynamic两种记录格式对于存放在BLOB中的数据采用了完全的行溢出的方式。如图,在数据页中只存放20个字节的指针(溢出页的地址),实际的数据都存放在Off Page(溢出页)中。
  • Compact和Redundant两种格式会在记录的真实数据处存储一部分数据(存放768个前缀字节)。
MySQL原理 - InnoDB引擎 - 记录存储 - Compact 格式
uuqaz的博客
03-30 1360
MySQL 服务器上负责对表中数据的读取和写入工作的部分是存储引擎,比如 InnoDB、MyISAM、Memory 等等,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,目前OLTP业务的表如果是使用 MySQL 一般都会使用 InnoDB 引擎,这也是默认的表引擎。 为了能说明 InnoDB 引擎的原理,我们必须先搞清楚 InnoDB 的存储结构,通过这些存储结构才能实现 InnoDB 的事务特性。 首先我们来看看 InnoDB 表的一数据是如何存储的。InnoDB是一个持久化的存...
Mysql的row_format
u011579204的专栏
01-18 1527
innodb 一般对应 Compact  ,MyISAM 一般对应静态与动态   mysql中若一张表里面存在varchar、text以及其变形、blob以及其变形的字段的话,那么这个表其实也叫动态表,即该表的 row_format是dynamic,就是说每条记录所占用的字节是动态的。其优点节省空间,缺点增加读取的时间开销。反之,这张表叫静态表,该表 row_format为fixed,即每条记
Mysql-ROW_FORMAT
weixin_30507269的博客
03-20 169
引用链接:https://blog.csdn.net/wslovelcy/article/details/49865533 链接二:https://www.cnblogs.com/wade-luffy/p/6289183.html tablenam= ... ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT ; ROW_FOR...
MYSQL ROW_FORMAT=Compact
weixin_33816821的博客
09-06 4372
https://dev.mysql.com/doc/refman/5.6/en/innodb-row-format-antelope.html https://docs.oracle.com/cd/E17952_01/mysql-5.5-en/innodb-row-format-antelope.html
undrop-for-innodb:适用于MySQLInnoDB的TwinDB数据恢复工具包
05-11
TwinDB数据恢复工具包是一组工具,可在较低级别上与MySQL文件一起使用,并允许在不同的故障情况后恢复InnoDB数据库。 该工具箱也称为InnoDB的UnDrop ,其名称更准确,因为该工具箱可用于InnoDB表。 当备份不可用时...
mysql 5.6 新特性-innodb
01-22
### MySQL 5.6 新特性-InnoDB:深入剖析 #### MySQL 5.6 版本简介及重要性 MySQL 5.6 是 MySQL 的一个重要版本,相比于之前的版本(如 MySQL 5.1 和 5.5),它在多个方面进了显著的改进。这些改进不仅提升了...
MySQL存储引擎之争-InnoDB与MyISAM全面对决
08-01
MySQL是世界上最受欢迎的关系型数据库管理系统之一,其核心特性之一就是支持多种存储引擎。本文主要讨论的是InnoDB和MyISAM这两个引擎的对决,两者在事务处理、数据恢复、并发控制、存储空间占用以及读取性能等方面...
MySQL笔记-InnoDB物理及逻辑存储结构
12-14
首先是InnoDB的物理结构 它是B+树,这里有一点要注意的,数据=索引; 叶子结点存放数据、主键、事务ID、回滚指针的。 二级索引最终都会指向主键索引。 在InnoDB引擎中,创建表没有主键,InnoDB会把not null中unique...
MySQL中的(ROW_FORMAT )
多头注意力探索Now
07-02 3742
Innodb引擎的格式选项说明
mysql compact_MYSQLInnoDB和ROW_FORMAT=COMPACT - wangqiaowqo - JavaEye技术网站
weixin_29854111的博客
01-20 2136
MYSQLInnoDB是什么?一种表驱动,除了innodb还有其它的,例如isam,myisam等.innodb的特色在于支持并发与表间引用 MySQL支持多种存储引擎,用户可以方便的选用不同的存储引擎来支持自己的应用,每种不同的存储引擎都有其自己的特性Innodb是其中的一种存储引擎,它的特性是支持事务,并且采用多版本并发控制的方式来提高并发度主要是事务表,当一个事务全部完成,才会执upda...
mysql中的格式之compact格式分析
小x的博客
07-19 1267
mysql中的格式之compact格式分析
转:MySQL Row Format(MySQL格式详解)
weixin_30879833的博客
11-29 430
MySQL Row Format(MySQL格式详解) --转载自登博的博客 转载于:https://www.cnblogs.com/yhq1314/p/10039856.html
mysql创建/编辑表时的 ROW_FORMAT = Dynamic 和 Compact 有什么区别
热门推荐
festone000的专栏
05-03 7万+
比如我在mysql建个表,: DROP TABLE IF EXISTS `test_table`; CREATE TABLE `test_table` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AU...
【服了!女神说不学会这个,就要和我分手】MySQL中COMPACT格式详解及MySQL怎么存储null详细答案
最新发布
原神高手的博客
01-04 1172
MySQLInnoDB引擎存储数据有四种存储格式,今天我们来谈谈Compact,是MySQL中默认的也是最常用的一种存储格式InnoDB存储引擎在MySQL中支持四种存储格式,它们分别是:Compact(紧凑格式):Compact是InnoDB的默认存储格式,也是最常用的格式。它以高效的方式存储数据,包括NULL列表的位图压缩和变长数据的前缀压缩。Compact格式在存储空间和性能之间取得了一个平衡。
MySql进阶】格式详解:COMPACT、Dynamic
博客
06-10 9810
概述 我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 格式 或者 记录格式InnoDB 到现在为止设计了4种不同类型的 格式 ,分别是 Compact 、 Redundant 、Dynamic 和 Compressed 格式mysql5.0之后的默认格式为Compact , 5.7之后的默认格式为dynamic COMPACT格式 变长字段长度列表 我们知道 MySQL 支持一些变长的数据类型,比如 VARCHAR(M) 、 VARBINARY(M) 、
mysql innodb row_format_INNODB物理结构(ROW_FORMAT=COMPACT) | 学步园
weixin_28797919的博客
02-07 428
Each index record contains a five-byte header that may be preceded by a variable-length header. The header is used to link together consecutive records, and also in row-level locking.每个索引记录包含一个五字节的头,在...
认真学习InnoDB格式
小小默:进无止境
10-09 1228
我们平时的数据以为单位来向表中插入数据,这些记录在磁盘上的存放方式也被称为`格式`或者`记录格式`。InnoDB存储引擎设计了4中不同类型的格式,分别是Compact、Redundant、Dynamic和Compressed格式。 查看MySQL默认格式: ```sql # 查看变量 show VARIABLES like '%innodb_default_row_format%' # 查看MySQL系统变量 select @@innodb_default_row_format ``` 也可
InnoDB表误删恢复:undrop-for-innodb工具实战
MySQL异常恢复 - "drop表恢复"主要关注的是当在MySQL数据库中执DROP TABLE语句错误删除了InnoDB表时的恢复策略。这种情况下,由于InnoDB存储引擎的特性(innodb_file_per_table=ON),表的.ibd文件会被同时删除,...
写文章

分类专栏

  • 设计模式 3篇
  • 后端技术点 1篇
  • Nginx 4篇
  • 计算机网络 4篇
  • 微服务架构
  • SpringCloud 19篇
  • Redis 5篇
  • RabbitMQ 5篇
  • Kafka 4篇
  • Linux系统 20篇
  • 并发编程 12篇
  • 数据结构与算法
  • 数据结构 36篇
  • 算法 5篇
  • JVM 8篇
  • 面试 2篇
  • 项目 16篇
  • JavaEE核心技术(spring全家桶+boot) 59篇
  • JavaWeb基础 13篇
  • 常见错误汇总 4篇
  • 数据库系列(mysql、jdbc) 40篇
  • Web前端基础 21篇
  • JAVA系列 22篇
  • 基本软件学习 9篇
  • 论文 7篇

最新评论

  • ReentrantLock 原理

    巨人IIT: 很详细,大佬牛🐮

  • 一、电脑端实现单片机与ESP8266的通信

    2301_79652701: 跑不动表情包

  • 【mysql是怎样运行的】-InnoDB行格式

    JH灰色: 感觉书里说的l是不是表示范围更好

  • 【mysql是怎样运行的】-InnoDB行格式

    JH灰色: 1字节8比特 范围-128到127,二进制01111111表示127,剩下1就是第二个字节表示了

  • 【mysql是怎样运行的】-InnoDB行格式

    qq_27502511: 当M*W>255 && L=128时,变长字段长度列表是具体怎么使用两个字节来存储128这值的。如果第一位为0,最大也就127,使用第二个字符这个值一定大于256,博主解释一下吗?

大家在看

  • Java | Leetcode Java题解之第429题N叉树的层序遍历 58
  • C语言 | Leetcode C语言题解之第429题N叉树的层序遍历
  • PHP isset() 和 empty() 区别
  • PHP中如何使用三元条件运算符
  • 【已解决 含pytorch 代码调试分析】pytorch 数据类型基础,与Python数据类型的区别,为什么要另外设置新的pytorch 数据类型? 570

最新文章

  • 【mysql是怎样运行的】-EXPLAIN详解
  • 【mysql是怎样运行的】-B+树索引深入理解
  • 【mysql是怎样运行的】-InnoDB数据页结构
2023年4篇
2022年9篇
2021年38篇
2020年241篇
2019年34篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家亳州玻璃钢雕塑制作厂家三亚玻璃钢伟人像雕塑定制长沙公园玻璃钢雕塑定制四川玻璃钢人物雕塑定制泉州玻璃钢雕塑工厂脱模蜡小型玻璃钢花盆哪里有柳州玻璃钢座椅雕塑厂家玻璃钢园林雕塑感应蚌埠步行街玻璃钢雕塑定做价格玻璃钢雕塑大型蔬菜盘锦玻璃钢商场美陈定做玻璃钢卡通雕塑玻璃钢雕塑上色方法镂空玻璃钢雕塑小品六安秋季商场美陈滨州市玻璃钢雕塑广东商场美陈价格商场玻璃钢卡通雕塑费用是多少玻璃钢雕塑款式时髦安徽商城艺术玻璃钢雕塑价格漯河玻璃钢卡通动物雕塑厂家地址商场中庭鱼形美陈吊饰效果图无锡商业广场玻璃钢卡通雕塑生产玻璃钢卡通雕塑尺寸黔南玻璃钢卡通雕塑沈阳户外玻璃钢雕塑定制玻璃钢花盆天津厂家天津步行街玻璃钢雕塑订做价格山东玻璃钢人物雕塑多少钱河北户外商场美陈批发香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化