我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql-innodb行记录格式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql-innodb行记录格式

cdn.shimo.im/wLa8Ccuo2bAFpz1G/image.png!thumbnail"},"29:1|30:0|3:."613px."|4:."73.275px."|7:1|crop:."."|frame:."none."|ori-height:."104."|ori-width:."870.""],[20,"首部是字段长度偏移列表,按照列的顺序逆序放置,其长度为(若列的长度小于255字节,用1字节表示;若大于255个字节,用2字节表示)"],[20,".n","text-indent:."1.""],[20,"记录头信息:占用6字节,含义如图:"],[20,".n","text-indent:."1.""],[20,{"gallery-block":"/file/upload/202210/18/ynstontwmmu.png!thumbnail"},"29:1|30:0|3:."613px."|4:."215.738px."|7:1|crop:."."|frame:."none."|ori-height:."353."|ori-width:."1003.""],[20,"说明:n_fields值代表一行中列的数量,mysql一行中最多的列为1023;1byte_offs_flag:定义了偏移列表占用1字节还是2字节。.n最后部分即为实际存储的每个列的数据"],[20,".n","text-indent:."1.""],[20,"注意:对于varchar类型的NULL值,不占用任何存储空间,而char类型的NULL值需要占用空间.n"],[20,"compact,5.0.3以后默认行格式","27:."12."|8:1"],[20,".n","text-indent:."1.""],[20,{"gallery-block":"/file/upload/202210/18/kkmlnukfjpx.png!thumbnail"},"29:1|30:0|3:."613px."|4:."74.0625px."|7:1|crop:."."|frame:."none."|ori-height:."116."|ori-width:."960.""],[20,"说明:.n首部是一个"],[20,"非NULL变长字段","8:1"],[20,"长度列表,且按照列的顺序逆序放置,其长度为(若列的长度小于255字节,用1字节表示;若大于255个字节,用2字节表示)"],[20,".n","text-indent:."1.""],[20,"NULL标志位:该行数据是否有NULL值,有则用1表示,占用1个字节"],[20,".n","text-indent:."1.""],[20,"记录头信息:固定占用5字节,含义如图:"],[20,".n","text-indent:."1.""],[20,{"gallery-block":"/file/upload/202210/18/tum51izeoed.png!thumbnail"},"29:1|30:0|3:."613px."|4:."217.913px."|7:1|crop:."."|frame:."none."|ori-height:."353."|ori-width:."993.""],[20,"说明:通过record_type分析可得,在innodb存储引擎中"],[20,"页内部是通过一种链表的结构来串连各个行记录的","8:1"],[20,"。.n最后的部分为实际存储每个列的数据(注:1.不管是char类型还是varchar类型,NULL不占该部分任何空间,只占有NULL标志位;2.固定长度char字段在未能完全占用其长度空间时,会用Ox20来进行填充)"],[20,".n","text-indent:."1.""],[20,"每行数据除了用户定义的列外,还有两个隐藏列(事务ID(DB_TRX_ID)6字节,回滚指针列(DB_ROLL_PTR),7字节),若没有定义主键,还会增加一个rowid(DB_ROW_ID)6字节"],[20,".n","text-indent:."1.""],[20,"Antelope文件格式包括compact和Redundant行记录格式.nBarracuda文件格式包括dynamic和compressed行记录格式.n"],[20,".n","text-indent:."1.""],[20,"行溢出数据","27:."12."|8:1"],[20,".ncompact和redundant存放BLOB的行溢出数据存储格式如图:.n"],[20,{"gallery-block":"/file/upload/202210/18/moqkmso0ll0.png!thumbnail"},"29:1|30:0|3:."613px."|4:."145.575px."|7:1|crop:."."|frame:."none."|ori-height:."166."|ori-width:."699.""],[20,"说明:如果可以在一个页中至少存放两行数据,那么varchar类型的数据就不会存放到BLOB页中;当长度超过8098后,就会将溢出的数据存放在BLOB页中。.n"],[20,"varchar(N)中N指的是","27:."12.""],[20,"字符的长度","27:."12."|8:1"],[20,",而文档说明中varchar类型最大支持","27:."12.""],[20,"65535单位是字","27:."12."|8:1"],[20,".n"],[20,"节且指的是所有varchar列的长度总和。","27:."12."|8:1"],[20,".ndynamic和compressed存放在BLOB中的数据采用的行溢出方式如图:.n"],[20,{"gallery-block":"/file/upload/202210/18/jotc4mqze5q.png!thumbnail"},"29:1|30:0|3:."613px."|4:."145.587px."|7:1|crop:."."|frame:."none."|ori-height:."176."|ori-width:."741.""],[20,"说明:在数据页中只存放20个字节的指针,实际的数据都存放在off page中.n行溢出总结:.n1.行记录长度大约超过page一半时,依次将最长的列拆分发到多个page存储,直到不再超过page的一半为止;"],[20,".n","text-indent:."1.""],[20,"2.溢出的列放在一个page中不够的话,继续放在新的page中"],[20,".n","text-indent:."1.""],[20,"3.compact格式下,溢出的列只存储前768字节"],[20,".n","text-indent:."1.""],[20,"4.dynamic格式下,溢出的列只存储前20字节(指针)"],[20,".n","text-indent:."1.""],[20,"5.select * 会同时读取这些溢出的列,代价很高"],[20,".n","text-indent:."1.""],[20,"6.执行计划中出现filesort或temporary table时,一般都无法放在内存中,需要变成disk tmp table,IO代价更高。"],[20,".n","text-indent:."1.""],[20,"dynamic","27:."12."|8:1"],[20,",将长字段完全off-page存储"],[20,".n","text-indent:."1.""],[20,"compressed","27:."12."|8:1"],[20,"(存储的行数据会以zlib算法进行压缩)","27:."12.""],[20,"将data、index、pages进行压缩,但buffer pool中的pages则不压缩"],[20,".n","text-indent:."1.""],[20,"CHAR行结构存储","8:1"],[20,".nchar(N)中N是指字符的长度,所以在不同的字符集下,char类型列内部存储的可能不是定长的数据。"]]">

行记录格式

可以通过show table status like 'table_name'命令查看当前表使用的行格式(row_format字段)

row_format

redundant,最早的行格式

首部是字段长度偏移列表,按照列的顺序逆序放置,其长度为(若列的长度小于255字节,用1字节表示;若大于255个字节,用2字节表示)

记录头信息:占用6字节,含义如图:

说明:n_fields值代表一行中列的数量,mysql一行中最多的列为1023;1byte_offs_flag:定义了偏移列表占用1字节还是2字节。

最后部分即为实际存储的每个列的数据

注意:对于varchar类型的NULL值,不占用任何存储空间,而char类型的NULL值需要占用空间


compact,5.0.3以后默认行格式

说明:

首部是一个非NULL变长字段长度列表,且按照列的顺序逆序放置,其长度为(若列的长度小于255字节,用1字节表示;若大于255个字节,用2字节表示)

NULL标志位:该行数据是否有NULL值,有则用1表示,占用1个字节

记录头信息:固定占用5字节,含义如图:

说明:通过record_type分析可得,在innodb存储引擎中页内部是通过一种链表的结构来串连各个行记录的

最后的部分为实际存储每个列的数据(注:1.不管是char类型还是varchar类型,NULL不占该部分任何空间,只占有NULL标志位;2.固定长度char字段在未能完全占用其长度空间时,会用Ox20来进行填充)

每行数据除了用户定义的列外,还有两个隐藏列(事务ID(DB_TRX_ID)6字节,回滚指针列(DB_ROLL_PTR),7字节),若没有定义主键,还会增加一个rowid(DB_ROW_ID)6字节

Antelope文件格式包括compact和Redundant行记录格式

Barracuda文件格式包括dynamic和compressed行记录格式


行溢出数据

compact和redundant存放BLOB的行溢出数据存储格式如图:

说明:如果可以在一个页中至少存放两行数据,那么varchar类型的数据就不会存放到BLOB页中;当长度超过8098后,就会将溢出的数据存放在BLOB页中。

varchar(N)中N指的是字符的长度,而文档说明中varchar类型最大支持65535单位是字节且指的是所有varchar列的长度总和。


dynamic和compressed存放在BLOB中的数据采用的行溢出方式如图:

说明:在数据页中只存放20个字节的指针,实际的数据都存放在off page中

行溢出总结:

    1.行记录长度大约超过page一半时,依次将最长的列拆分发到多个page存储,直到不再超过page的一半为止;

    2.溢出的列放在一个page中不够的话,继续放在新的page中

    3.compact格式下,溢出的列只存储前768字节

    4.dynamic格式下,溢出的列只存储前20字节(指针)

    5.select * 会同时读取这些溢出的列,代价很高

    6.执行计划中出现filesort或temporary table时,一般都无法放在内存中,需要变成disk tmp table,IO代价更高。

dynamic,将长字段完全off-page存储

compressed(存储的行数据会以zlib算法进行压缩)将data、index、pages进行压缩,但buffer pool中的pages则不压缩

CHAR行结构存储

char(N)中N是指字符的长度,所以在不同的字符集下,char类型列内部存储的可能不是定长的数据。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql-innodb行记录格式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

MySQL 服务器上负责对表中数据的读取和写入工作的部分是存储引擎,比如 InnoDB、MyISAM、Memory 等等,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,目前OLTP业务的表如果是使用 MySQL 一般都会使用 InnoDB 引擎,这也
MySQL原理 - InnoDB引擎 - 行记录存储 - Compact 行格式
2018-04-24

MySQL原理 - InnoDB引擎 - 行记录存储 - Redundant行格式

本文基于 MySQL 8在上一篇:MySQL原理 - InnoDB引擎 - 行记录存储 - Compact格式 中,我们介绍了什么是 InnoDB 行记录存储以及 Compact 行格式,在这一篇中,我们继续介绍其他三种行格式。Redundant 行格式这个是
MySQL原理 - InnoDB引擎 - 行记录存储 - Redundant行格式
2020-12-09

MySQL Innodb行格式详解

目录1、指定行格式的语法2、COMPACT行格式2.1 变长字段长度列表2.2 NULL值列表2.3 记录头信息2.4 记录真实数据2.5 分析Compact行记录的内部结构3、Dynamic和Compressed行格式3.1 行溢出3.2
MySQL Innodb行格式详解
2024-09-11

1. MySQL体系结构——InnoDB存储引擎表、页结构、行记录格式

本章将重点分析表的物理存储特征,即数据在表中是如何组织存放的。也就是说,表就是关于特定实体的数据集合,这也是关系型数据库模型的核心。4.1 索引组织表在 InnoDB存储引擎中,表都是按照主键顺序存放的,这样的存储方式的表称为索引组织表。如果创建表时没有显式的
1. MySQL体系结构——InnoDB存储引擎表、页结构、行记录格式
2016-03-15

(9)MySQL进阶篇SQL优化(InnoDB锁-记录锁)

1.概述InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则InnoDB将使用表锁!在
(9)MySQL进阶篇SQL优化(InnoDB锁-记录锁)
2019-08-22

如何查看mysql执行sql记录

要查看MySQL执行的SQL记录,可以通过以下方式:使用MySQL的查询日志功能:在MySQL配置文件中打开查询日志功能,然后重启MySQL服务。查询日志会记录所有执行的SQL语句,可以通过查看日志文件来查看执行的SQL记录。使用MySQL
如何查看mysql执行sql记录
2024-04-22

MySQL查看event执行记录的实现

目录1. 查看 EVENT 执行记录2. 示例3. 结论mysql 是一款流行的关系型数据库管理系统,它提供了许多功能来帮助用户管理和操作数据库。其中之一就是 EVENT事件,它允许用户在特定的时间间隔内自动执行指定的操作,类似于计划任务。
MySQL查看event执行记录的实现
2023-11-13

让MySQL为我们记录执行流程 - G

让MySQL为我们记录执行流程 我们可以开启profiling,让MySQL为我们记录SQL语句的执行流程 查看profiling参数shell > select @@profiling;进行更改shell > set profiling = 1;执行语句se
让MySQL为我们记录执行流程 - G
2019-12-01

mysql怎么获取指定行数号的记录

在MySQL中,可以使用LIMIT子句来获取指定行数号的记录。例如,要获取第10行到第20行的记录,可以使用以下查询语句:SELECT * FROM table_name LIMIT 9, 10;这里的LIMIT子句包含两个参数,第一个参
mysql怎么获取指定行数号的记录
2024-04-09

编程热搜

目录