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内存结构
聚集索引与非聚集索引: 聚集索引:主键,有序,存储顺序与内存一致 非聚集索引:非主键,无序 聚集索引在叶子节点存储的是表中的数据 非聚集索引在叶子节点存储的是主键和索引列 使用非聚集索引查询出数据 ...
随机推荐
- luogu P4428 [BJOI2018]二进制
luogu 先考虑怎样的二进制串才会被3整除.可以发现如果二进制位第\(0,2,4...2n\)位如果为\(1\),那么在模3意义下为1,如果二进制位第\(1,3,5...2n+1\)位如果为\(1\ ...
- SSO系统介绍
1.什么是sso系统 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于 ...
- 网络初级篇之RSTP(原理与配置)
一.RSTP的产生 前面的文章写到了当网络拓扑发生变化时,STP的收敛速度大约需要花费30秒-50秒的时间才会继续转发数据.这样在实际生产环境中花费的时间是非常长的,这样RSTP(快速生成树协议)便应 ...
- python网络编程:socket半连接池、UDP通讯模板
一.TCP半连接池原理 二.UDP通讯 三.UDP聊天 四.UDP聊天2 五.UDP会粘包吗 六.UDP总结 七.UDP与TCP对比 一.TCP半连接池原理 客户端 import socket cli ...
- manjaro 常用软件安装
1.搜狗输入法 sudo pacman -S fcitx-sogoupinyin fcitx-configtool fcitx-im yay -Sa fcitx-qt4 sudo vim /etc/e ...
- JAVA NIO 文件部分
NIO java使用NIO的目的是为了提升性能,实际上老的io程序也已经优化过了,速度也有相应的提升. NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector.传 ...
- 02-SQLServer数据库附加后处于只读模式
一.总结 附加数据库后,遇到只读,并且取消只读的时候报错操作系统错误,一般都是附加的时候,使用的是SQLServer用户登录附加的,只要使用windows用户登录数据库重新附加一下就ok了. 二.处理 ...
- 使用js拆分带参数的URL,将参数分离出来
url中的内容www.XXXX.com?content=123; 一下为js内容,包装在一个init方法中. init(); function init(){ var theRequest = new ...
- c++关于字符串的读入和截取
#include<iostream>#include<string>#include<vector>using namespace std;vector<st ...
- Vue 页面 前进刷新 后退不刷新(keepAlive)
前言 遇到这一个个问题 需要是这样的 Vue里面的不刷新问题 页面分为: A 主页 B列表页 C 详情页 A beforeRouteLeave 时设置 to.meta.keepAlive = ...