iis服务器助手广告
返回顶部
首页 > 资讯 > 数据库 >mysql-innodb行记录格式
  • 780
分享到

mysql-innodb行记录格式

2024-04-02 19:04:59 780人浏览 泡泡鱼
摘要

cdn.shimo.im/wLa8Ccuo2bAFpz1G/image.png!thumbnail"},"29:1|30:0|3:."613px."|4:."73.275px."|7:1|crop:."."

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/imgs/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/imgs/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/imgs/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/imgs/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/imgs/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类型列内部存储的可能不是定长的数据。

您可能感兴趣的文档:

--结束END--

本文标题: mysql-innodb行记录格式

本文链接: https://www.lsjlt.com/news/46185.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • InnoDB行存储格式是什么
    这篇文章主要讲解了“InnoDB行存储格式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“InnoDB行存储格式是什么”吧! ...
    99+
    2024-04-02
  • MySQL如何从二进制内容看InnoDB行格式
    这篇文章主要介绍“MySQL如何从二进制内容看InnoDB行格式”,在日常操作中,相信很多人在MySQL如何从二进制内容看InnoDB行格式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • Mysql InnoDB B+树索引目录项记录页管理
    目录Mysql InnoDB B+树索引目录项记录管理一、目录项记录页二、当目录项记录页也变多后三、B+ 树Mysql InnoDB B+树索引目录项记录管理 接上一篇内容,Inno...
    99+
    2024-04-02
  • MySQL Innodb怎么让MDL LOCK和ROW LOCK记录到errlog
    本篇内容主要讲解“MySQL Innodb怎么让MDL LOCK和ROW LOCK记录到errlog”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL I...
    99+
    2024-04-02
  • 怎么理解mysql innodb的行锁方式
    本篇内容主要讲解“怎么理解mysql innodb的行锁方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解mysql innodb的行锁方式”吧! ...
    99+
    2024-04-02
  • mysql查询连续记录方式
    目录案例解决思路1.对满足初次查询的数据赋予一个自增列b2.用自增的id减去自增列b3.对等差列c分组, 并将分组的id组装起来4.根据组装的id去找数据总结建议案例 最近遇到一个业...
    99+
    2024-04-02
  • MySQL中行记录的操作示例
    这篇文章主要介绍MySQL中行记录的操作示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Mysql管理软件中, 可以通过sql语句中的dml语言来实现数据的操作, 包括1、使用I...
    99+
    2024-04-02
  • 如何查看mysql执行sql记录
    要查看MySQL执行的SQL记录,可以通过以下方式: 使用MySQL的查询日志功能:在MySQL配置文件中打开查询日志功能,然后...
    99+
    2024-04-22
    mysql
  • 记录java使用EasyExcel进行单元格内换行操作
    首先是在需要换行的地方将 \n 或者 \r\n 替换为 String.valueOf((char)10) ,有时候不替换好像也能用 第一步完成后可能导出的内容还是无法换行,需要双击单元格才会换行, 在导出的java实体类上加入注解 ...
    99+
    2023-08-31
    java 开发语言
  • 怎么理解mysql innodb的行锁
    这篇文章主要讲解了“怎么理解mysql innodb的行锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解mysql innodb的行锁”吧! ...
    99+
    2024-04-02
  • mysql innodb的行锁举例分析
    这篇文章主要讲解了“mysql innodb的行锁举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql innodb的行锁举例分析”吧! ...
    99+
    2024-04-02
  • Mysql中怎么实现 InnoDB行锁
    Mysql中怎么实现 InnoDB行锁,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Mysql InnoDB行锁实现方式&nb...
    99+
    2024-04-02
  • 【MYSQL】InnoDB行溢出数据说明
        首先说下MySQL数据库的varchar字段,真的很实用,它可以存放65536字节的数据,比oracle和sqlserver大多了,但是在使用varchar时也有几点要注意; ...
    99+
    2024-04-02
  • MySQL查看event执行记录的实现
    目录1. 查看 EVENT 执行记录2. 示例3. 结论mysql 是一款流行的关系型数据库管理系统,它提供了许多功能来帮助用户管理和操作数据库。其中之一就是 EVENT事件,它允许用户在特定的时间间隔内自动执行指定的操...
    99+
    2023-11-13
    MySQL查看event执行记录 MySQL查看event
  • mysql binlog查看历史sql执行记录
    前情提要 最近有开发同学把测试库的数据干没了,反馈说是orm做了字段text转mediumtext操作导致的。 作为变更字段类型,且是兼容的理论上不可能存在这个问题,所以为了一探究竟他到底说的是不是假...
    99+
    2023-09-03
    mysql sql 数据库
  • mysql innodb的行锁(5) --next-Key 锁
    间隙锁 next-key, 是针对范围条件不存在的记录上锁,避免不可重复读和幻象读。 如果是 read committed 的隔离级别,则不存在此问题。 所以: 我们在开发中,如果使用 repeatable...
    99+
    2024-04-02
  • MySQL中innodb行锁怎么实现
    在MySQL中,InnoDB引擎通过使用锁来实现行级锁。行锁可以通过以下几种方式来实现:1. 自动行锁:InnoDB引擎会根据需要自...
    99+
    2023-10-09
    MySQL
  • MySQL innodb事务的实现方式
    这篇文章主要讲解了“MySQL innodb事务的实现方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL innodb事务的实现方式”吧! &n...
    99+
    2024-04-02
  • 如何向MySQL数据表插入行记录
    这篇文章主要介绍了如何向MySQL数据表插入行记录,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。摘要:为装载数据是管理员的重要职责之一,正因...
    99+
    2024-04-02
  • 更新 MySQL 记录
    标题:MySQL UPDATE语句的代码示例 在MySQL数据库中,UPDATE语句用于修改已存在的数据记录。本文将针对UPDATE语句进行详细说明,并给出具体的代码示例。 UPDA...
    99+
    2024-02-22
    mysql 语句 update sql语句
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作