InnoDB是一个将数据存储到磁盘上的存储引擎。对于更新/写入的数据,先将数据从磁盘中加载到内存,更新后再将数据刷新到磁盘。

行格式

而磁盘与内存交互的数据,InnoDB采取将数据分为若干,一页一般为16kb,以页为单位磁盘与内存之间交互传输。表中的数据一般是以记录为单位进行操作,页中最少存储两条记录,而记录在磁盘上存放的方式被称为行格式/记录格式;

在创建表时声明 ROW_FORMAT=行格式名称

InnoDB设计了四种行格式

  • compact

记录的额外信息
  •  变长字段长度列表:变长字段即varchar/varchary/text/blob等,列表内存放记录中这些字段真实数据占用的字节长度,列表形式按列的顺序逆序存放;

    • 表示真正字符占用的字节数:如果某个可变字段允许存储的最大字节数(字符数*字符集maxLen)超过255字节并且真实存储的字节数超过127字节则使用2个字节,反之1个字节。那么总的字节数为各个变长字段占用字节数相加。不保存null值列的长度。如果没有变长字段则没有这个部分。
  •   NULL值列表:存储该记录值为null的列。
    • 首先统计允许存储null的列,并将每个允许存储null的列对应一个二进制位(列值为null二进制为1,反之为0),二进制位按照列的顺序逆序排列;
    • 最后,null值列表表示需为整数个字节(一个字节8位),即二进制位个数没有满足的高位补0,比如有三个字段可为null,不足一个字节,那么表示为00000111,十六进制为0x07,如果表中有超过9个字段均为null,则用两个字节表示。
  •  记录头信息:由5个字节(40位)组成。
  • 记录的真实数据:除了用户自定义的列,MySQL还会为每个记录默认添加一些列
    • DB_ROW_ID:没有定义主键及唯一键才会添加
    • DB_TRX_ID
    • DB_ROLL_PTR
  •  真实列:
    • 不管什么字符集下,某字段声明为char(10),但实际长度为2字节,那么将会用空格字符填充剩下8个 字节;varchar没有这个要求。

对于CHAR(M)类型的列来说,当列采用的是定长字符集时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表

    • 当前记录,某字段实际值为null,将存储在null值列表,不在这里存储
    • 每个字段存储以字符集对应形式存储
  • redundant
  • dynamic
  • compressed

InnoDB记录存储结构的更多相关文章

  1. MySQL之 InnoDB记录结构(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)

    以下内容来自掘金小册 MySQL 是怎样运行的:从根儿上理解 MySQL 版权归原作者所有! 页是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位. 指定和修改行格式的语法 ...

  2. 使用innodb_ruby探查Innodb索引结构

    使用innodb_ruby探查Innodb索引结构 innodb_ruby 是使用 Ruby 编写的 InnoDB 文件格式解析器.innodb_ruby 的目的是暴露一些其他隐藏的 InnoDB 原 ...

  3. 转:InnoDB Page Structure(InnoDB页面结构详解)

    InnoDB Page Structure(InnoDB页面结构详解) 此转载自登博的博客,给大家分享.

  4. 第五节:从一条记录说起——InnoDB记录结构

    <MySQL 是怎样运行的:从根儿上理解 MySQL>第五节:从一条记录说起——InnoDB记录结构 准备工作 现在只知道客户端发送请求并等待服务器返回结果.    MySQL什么方式来访 ...

  5. 详细了解 InnoDB 内存结构及其原理

    最近发现,文章太长的话,包含的信息量较大, 并且需要更多的时间去阅读.而大家看文章,应该都是利用的一些碎片时间.所以我得出一个结论,文章太长不太利于大家的吸收和消化.所以我之后会减少文章的长度,2-3 ...

  6. Mysql InnoDB表结构

    索引组织表 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键(Prim ...

  7. MyISAM 和 InnoDB 索引结构及其实现原理

    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据. 索引的实现通常使用B_TREE. B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据; ...

  8. MySQL提升笔记(4)InnoDB存储结构

    这一节本来计划开始索引的学习,但是在InnoDB存储引擎的索引里,存在一些数据存储结构的概念,这一节先了解一下InnodDB的逻辑存储结构,为索引的学习打好基础. 从InnoDB存储引擎的存储结构看, ...

  9. Innodb内存结构

      聚集索引与非聚集索引: 聚集索引:主键,有序,存储顺序与内存一致 非聚集索引:非主键,无序 聚集索引在叶子节点存储的是表中的数据 非聚集索引在叶子节点存储的是主键和索引列 使用非聚集索引查询出数据 ...

随机推荐

  1. 佳能单反SDK 步骤

    EdsInitializeSDK(); EdsGetCameraList(&eclr);//获取相机列表 EdsGetChildCount(eclr, &camCount);  //获 ...

  2. php操作 cookie

    1,设置cookie <?php setcookie('key'); setcookie('key1','value1'); setcookie(***); setcookie('key4', ...

  3. 使用docker搭建OpenResty开发环境

    Dockerfile文件: FROM centos:latest RUN yum install -y pcre-devel openssl-devel gcc curl wget perl make ...

  4. nginx 配置简单的静态页面

    nginx 文件服务配置,MIME和 default_type https://blog.csdn.net/qq_26711103/article/details/81116900 nginx 静态页 ...

  5. web录音——上传录音文件

    捕获麦克风 一.  前言    公司项目需要实现web录音,刚刚好接手此功能,由于之前未接触过,在网上找了些资料做对比 )   https://www.cnblogs.com/starcrm/p/51 ...

  6. JavaMaven【四、坐标&构件】

    maven的依赖都是使用坐标找到对应的构件来进行的 坐标 即groupId+artifactId+version 上图第一个红框是本项目的坐标 第二个红框是依赖的项目的坐标 构件 坐标对应的jar包 ...

  7. JavaWeb【JSTL】

    根据JSTL标签所提供的功能,可以将其分为5个类别. 核心标签 格式化标签 SQL 标签 XML 标签 JSTL 函数 使用方式 1.下载包 地址:http://archive.apache.org/ ...

  8. fastadmin 隐藏操作栏按钮

    formatter: function (value, row, index) { var that = $.extend({}, this); $(table).data({"operat ...

  9. zookeeper--为分布式应用提供协调服务

    1.概述 zookeeper是一个开源的.分布式的.为分布式应用提供协调服务的Apache项目 zookeeper的工作机制 zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服 ...

  10. RHEL7 网口绑定Network Teaming

    1.选择Networking Teaming配置方法 使用文本用户界面工具nmtui 使用命令行工具nmcli 使用ifcfg配置文件创建网络成组 使用图形用户界面配置网络成组     2.了解主接口 ...