InnoDB记录存储结构
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记录存储结构的更多相关文章
- MySQL之 InnoDB记录结构(转自掘金小册 MySQL是怎样运行的,版权归作者所有!)
以下内容来自掘金小册 MySQL 是怎样运行的:从根儿上理解 MySQL 版权归原作者所有! 页是MySQL中磁盘和内存交互的基本单位,也是MySQL是管理存储空间的基本单位. 指定和修改行格式的语法 ...
- 使用innodb_ruby探查Innodb索引结构
使用innodb_ruby探查Innodb索引结构 innodb_ruby 是使用 Ruby 编写的 InnoDB 文件格式解析器.innodb_ruby 的目的是暴露一些其他隐藏的 InnoDB 原 ...
- 转:InnoDB Page Structure(InnoDB页面结构详解)
InnoDB Page Structure(InnoDB页面结构详解) 此转载自登博的博客,给大家分享.
- 第五节:从一条记录说起——InnoDB记录结构
<MySQL 是怎样运行的:从根儿上理解 MySQL>第五节:从一条记录说起——InnoDB记录结构 准备工作 现在只知道客户端发送请求并等待服务器返回结果. MySQL什么方式来访 ...
- 详细了解 InnoDB 内存结构及其原理
最近发现,文章太长的话,包含的信息量较大, 并且需要更多的时间去阅读.而大家看文章,应该都是利用的一些碎片时间.所以我得出一个结论,文章太长不太利于大家的吸收和消化.所以我之后会减少文章的长度,2-3 ...
- Mysql InnoDB表结构
索引组织表 在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键(Prim ...
- MyISAM 和 InnoDB 索引结构及其实现原理
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据. 索引的实现通常使用B_TREE. B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据; ...
- MySQL提升笔记(4)InnoDB存储结构
这一节本来计划开始索引的学习,但是在InnoDB存储引擎的索引里,存在一些数据存储结构的概念,这一节先了解一下InnodDB的逻辑存储结构,为索引的学习打好基础. 从InnoDB存储引擎的存储结构看, ...
- Innodb内存结构
聚集索引与非聚集索引: 聚集索引:主键,有序,存储顺序与内存一致 非聚集索引:非主键,无序 聚集索引在叶子节点存储的是表中的数据 非聚集索引在叶子节点存储的是主键和索引列 使用非聚集索引查询出数据 ...
随机推荐
- 分布式之协调服务Zookeeper专题第一讲
写在前面: 再谈架构演进: 1.单体架构->tomcat(war) 演进:水平拆分(服务拆分,(用户服务,订单服务,商品服务)) 涉及问题:1).服务通信(webservice) 2).三态问题 ...
- MySQL 安装与基本概念
Mysql版本 第一条产品线:5.0.xx及升级到5.1.xx的产品系列,这条产品线继续完善与改进其用户体验和性能,同时增加新功能,这条路线可以说是MySQL早期产品的延续系列,这一系列的产品发布情况 ...
- 使用tomcat-maven-plugin自动化部署应用
目标:将应用自动打包并自动部署到远程tomcat容器. 1.在pom.xml中添加plugin <plugin> <groupId>org.apache.tomcat.mave ...
- java线程基础巩固---数据同步引入并结合jconsole,jstack以及汇编指令认识synchronized关键字
对于多线程编程而言其实老生成谈的就是数据同步问题,接下来就会开始接触这块的东东,比较麻烦,但是也是非常重要,所以按部就班的一点点去专研它,下面开始. 数据同步引入: 这里用之前写过的银行叫号的功能做为 ...
- cmake 出现undefined reference to xxx 解决办法
cmake没怎么用,主要觉得Clion很好用,但是默认clion使用的是cmake.再说一句clion是linux平台上很好用,个人强推. 当你使用clion的时候,如果使用了thread cstl等 ...
- Vue习题作业练习
作业一: 用table表格标签渲染以上数据,表格第一列是学生总分排名,最后一列是学生总分 <!DOCTYPE html> <html lang="en"> ...
- MariaDB基本命令
--查看当前日期select current_date();--查看当前时间select current_time();--查看当前日期.时间select now();--查看当前用户select u ...
- 快速开发MQTT(一)电子工程师眼中的MQTT
转载:https://zhuanlan.zhihu.com/p/54669124 DigCore 主页http://www.digcore.cn 文章首发于同名微信公众号:DigCore 欢迎关注同名 ...
- iconv命令
iconv 用法: Usage: iconv [OPTION...] [FILE...] Convert encoding of given files from one encoding to an ...
- php类知识---最疯狂的魔术方法serialize,_sleep,__wakeup,unserialize,__autoload,__clone
serialize-----把实例化的对象写入文件 __sleep 调用serialize时触发 <?php class mycoach { public function __construc ...