InnoDB行格式类型(Compact格式)

Compact行格式示意图:

Mysql中变长字段是如何存储的

mysql支持变长的数据类型,varchar(m)、varbinary(m)、text、blob类型等,这些变长的数据类型占用的存储空间分为两部分:

1.真正的数据内容

2.申明占用的字节数

如果不保存真实数据占用字节数,那么mysql服务器无法判断出真实数据有多长,导致无法准确取数据 。所以我们在存储真实数据的时候需要顺便把这些数据占用的字节数也存起来。

在compact行格式中,把所有边长类型的长度存放在行记录的开头部位形成一个列表,按照列的逆序存放

CHAR是一种固定长度的类型,VARCHAR则是一种可变长度的类型VARCHAR(M),M代表最大能存多少个字符。( MySQL5.0.3以前是字节,以后就是字符)

基本存储方式

变长字段的长度列表,null值列表,数据头,column01的值,column02的值,column0n的值...

变长字段如何存储

    # 假如有三个字段 id,name,age其中name是变长类型(Varchar)|id|name|age||1|wang|18|磁盘里的存储为:0x04 null值列表 数据头 1 wang 18# 其中0x04表示name长度为4
    # 假如有三个字段 id,name,age其中name是变长类型(Varchar)|id|name|age||1|wang|18||2|li|20|磁盘里的存储为:0x04 null值列表 数据头 1 wang 18 0x02 null值列表 数据头 2 li 20
    # 假如有三个字段 id,name,desc,age其中name,desc是变长类型(Varchar)|id|name|desc|age||1|wang|shuaige|18|磁盘里的存储为:0x07 0x04 null值列表 数据头 1 wang shuaige 18# 其中0x04表示name长度为4,0x07表示desc的长度为7

NULL值列表是如何存储的

Compact行格式会把可以为NULL的列统一管理起来,存一个标记为在NULL值列表中,如果表中没有允许存储NULL 的列,则 NULL值列表也不存在了。
二进制位的值为1时,代表该列的值为NULL。
二进制位的值为0时,代表该列的值不为NULL。

    # 假如有三个字段 id,name,age其中name是变长类型(Varchar)|id|name|age||1|wang|18|磁盘里的存储为:0x04 00 数据头 1 wang 18# 其中00表示name,age都不为空,当然这里id是主键,肯定不为空,所以没记录

记录头信息

除了变长字段长度列表、NULL值列表之外,还有一个用于描述记录的记录头信息,它是由固定的5个字节组成。5个字节也就是40个二进制位,不同的位代表不同的意思,如图:

记录的真实数据

记录的真实数据除了我们自己定义的列的数据以外,还会有三个隐藏列:

实际上这几个列的真正名称其实是:DB_ROW_ID、DB_TRX_ID,DB_ROLL_PTR。

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

行溢出数据

VARCHAR(M)类型的列最多可以占用65535个字节。其中的M代表该类型最多存储的字符数量,如果我们使用ascii字符集的话,一个字符就代表一个字节,我们看看VARCHAR(65535)是否可用:

报错信息表达的意思是:MySQL对一条记录占用的最大存储空间是有限制的,除BLOB或者TEXT类型的列之外,其他所有的列(不包括隐藏列和记录头信息)占用的字节长度加起来不能超过65535个字节。这个65535个字节除了列本身的数据之外,还包括一些其他的数据,比如说我们为了存储一个VARCHAR(M)类型的列,其实需要占用3部分存储空间:

  1. 真实数据
  2. 变长字段真实数据的长度
  3. NULL值标识

如果该VARCHAR类型的列没有NOT NULL属性,那最多只能存储65532个字节的数据,因为变长字段的长度占用2个字节,NULL值标识需要占用1个字节。

记录中的数据太多产生的溢出

一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65533个字节,这样就可能出现一个页存放不了一条记录。

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

记录中的数据太多产生的溢出

一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65533个字节,这样就可能出现一个页存放不了一条记录。

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

Dynamic和Compressed格式

这两种行格式类似于COMPACT行格式,只不过在处理行溢出数据时有点儿分歧,它们不会在记录的真实数据处存储一部分数据,而是把所有的数据都存储到其他页面中,只在记录的真实数据处存储其他页面的地址。另外,Compressed行格式会采用压缩算法对页面进行压缩。

参考资料:
Mysql中变长字段是如何存储的     https://blog.csdn.net/weixin_29491885/article/details/104846592

innodb行格式和数据页以及索引底层原理分析  https://blog.csdn.net/java_eehehe/article/details/105529353          https://www.cnblogs.com/qcfeng/p/7325307.html

Mysql compact行格式相关推荐

  1. mysql compact_[MySQL]InnoDB行格式剖析_MySQL - compact

    ... $this->layout->main=View::make('dash')->nest('content','comments.list',compact('comment ...

  2. MySQL如何存储数据?(InnoDB的Compact行格式)

    文章目录 1. 概要 2. compact行格式 2.1 示意图 2.2 记录的额外信息 2.2.1 变长字段长度列表 2.2.2 NULL值列表 2.2.3 记录头信息 2.2.4 记录的真实数据 ...

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

    MySQL 服务器上负责对表中数据的读取和写入工作的部分是存储引擎,比如 InnoDB.MyISAM.Memory 等等,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,目前OLTP业务的表如 ...

  4. MySQL COMPACT栏格式导致输出乱码

    CentOS 5.2, PHP 5.1.6, MYSQL 5.0.77. 数据库UTF8,表MYISAM引擎,采用PEAR::MDB2访问. 读取出的中文会有乱码尾巴.使用EMS/navicat查看数 ...

  5. mysql学习-Innodb行格式compact行记录解析

    前言 了解行结构的意义: 知道设置好的主键可以节省空间 知道char的大小设置错误还不如varchar 知道字符集对变长字段类型的影响 知道null 和 空串的区别 还有一些-我还没发现 Compac ...

  6. 【MySql进阶】行格式详解:COMPACT、Dynamic

    概述 我们平时是以记录为单位来向表中插入数据的,这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 . InnoDB 到现在为止设计了4种不同类型的 行格式 ,分别是 Compact . Re ...

  7. mysql format row_MySQL之InnoDB存储引擎:Row Format行格式

    MySQL下用的比较多.比较广的存储引擎就属InnoDB.这里我们来介绍下InnoDB存储引擎下数据记录的存储格式--Row Format行格式 基本操作 在MySQL中,所谓Row Format行格 ...

  8. mysql行格式_MySQL 行格式

    以 MySQL 默认的存储引擎 InnoDB 为例 InnoDB 包含以下四种行格式 Compact Redundant Dynamic Compressed 指定行格式 CREATE TABLE 表 ...

  9. mysql 表 页 行_Mysql之InnoDB行格式、数据页结构

    Mysql架构图 存储引擎负责对表中的数据的进行读取和写入,常用的存储引擎有InnoDB.MyISAM.Memory等,不同的存储引擎有自己的特性,数据在不同存储引擎中存放的格式也是不同的,比如Mem ...

最新文章

  1. 安卓手机充电慢_3.0适用苹果安卓手机充电器头
  2. 三星s轻奢android+p,三星Galaxy S轻奢版5月21日将至:骁龙660处理器+安卓8.0
  3. coremark 官网对各种单片机的测评评分
  4. 自定义ChannelHandler 的添加过程
  5. 机器学习两种距离——欧式距离和马氏距离
  6. 硬链接与符号链接的比较?
  7. bat批处理for /f命令
  8. 【Spring源码】Spring Transactional事务:传播机制(Propagation) 介绍 和 源码剖析
  9. C++ 简单实现unorderset和unordermap
  10. visio studio调试 字符串断点
  11. Java 创建xml文件和操作xml数据
  12. Anroid性能优化系列——Improving Layout Performance(二)
  13. Design System Application - Chapter 2 字体 Typography
  14. 极光im php,极光IM- 微信小程序 SDK - 极光文档
  15. oracle 取awr报告,Oracle生成awr报告
  16. profinet远程IO总线模块IP67防护等级的优势
  17. 第三方网络广告平台窘境
  18. D碳社区周报:上海市:推进崇明世界级生态岛碳中和示范区建设,院士专家在论坛上提出建议
  19. cobbler(一) cobbler实现系统自动安装
  20. The specified module could not be found的解决办法

热门文章

  1. kinetic安装cartographer及gazebo仿真测试教程[22年1月23日测试]
  2. 支付退款流程设计_如何设计订单系统?不妨看看这篇文章
  3. 软件驻场开发是什么?有什么好处
  4. 时代中国三年“老去” 岑钊雄500强空梦一场
  5. PyQt5制作一个爬虫小工具,获取某网上市公司的财务数据可视化
  6. ajax调用fastreport,使用Ajax更新ASP.Net MVC项目中的报表对象
  7. 鸟人的Android揭秘(9)——Init进程运行过程
  8. 赋值运算符与赋值表达式的说明和用法
  9. 在unity中使用Newtonsoft.Json
  10. VHDL语言设计8421码加法器(使用quartus)