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. 分布式之协调服务Zookeeper专题第一讲

    写在前面: 再谈架构演进: 1.单体架构->tomcat(war) 演进:水平拆分(服务拆分,(用户服务,订单服务,商品服务)) 涉及问题:1).服务通信(webservice) 2).三态问题 ...

  2. MySQL 安装与基本概念

    Mysql版本 第一条产品线:5.0.xx及升级到5.1.xx的产品系列,这条产品线继续完善与改进其用户体验和性能,同时增加新功能,这条路线可以说是MySQL早期产品的延续系列,这一系列的产品发布情况 ...

  3. 使用tomcat-maven-plugin自动化部署应用

    目标:将应用自动打包并自动部署到远程tomcat容器. 1.在pom.xml中添加plugin <plugin> <groupId>org.apache.tomcat.mave ...

  4. java线程基础巩固---数据同步引入并结合jconsole,jstack以及汇编指令认识synchronized关键字

    对于多线程编程而言其实老生成谈的就是数据同步问题,接下来就会开始接触这块的东东,比较麻烦,但是也是非常重要,所以按部就班的一点点去专研它,下面开始. 数据同步引入: 这里用之前写过的银行叫号的功能做为 ...

  5. cmake 出现undefined reference to xxx 解决办法

    cmake没怎么用,主要觉得Clion很好用,但是默认clion使用的是cmake.再说一句clion是linux平台上很好用,个人强推. 当你使用clion的时候,如果使用了thread cstl等 ...

  6. Vue习题作业练习

    作业一: 用table表格标签渲染以上数据,表格第一列是学生总分排名,最后一列是学生总分 <!DOCTYPE html> <html lang="en"> ...

  7. MariaDB基本命令

    --查看当前日期select current_date();--查看当前时间select current_time();--查看当前日期.时间select now();--查看当前用户select u ...

  8. 快速开发MQTT(一)电子工程师眼中的MQTT

    转载:https://zhuanlan.zhihu.com/p/54669124 DigCore 主页http://www.digcore.cn 文章首发于同名微信公众号:DigCore 欢迎关注同名 ...

  9. iconv命令

    iconv 用法: Usage: iconv [OPTION...] [FILE...] Convert encoding of given files from one encoding to an ...

  10. php类知识---最疯狂的魔术方法serialize,_sleep,__wakeup,unserialize,__autoload,__clone

    serialize-----把实例化的对象写入文件 __sleep 调用serialize时触发 <?php class mycoach { public function __construc ...