页结构简介

由于 MySQL 的真实数据是存储在磁盘, 因此在读写数据是会涉及磁盘 IO, 为了更高效率的读取, MySQL 设计页结构, 每次交互以页为单位读取到内存. 页的大小一般为 16KB

行格式

行格式主要分为四种类型Compact、Redundant、Dynamic和Compressed. 主要理解 Compact

Compact 行格式

行格式主要分为记录的额外信息, 记录的真实数据

变长字段长度列表

变长字段长度列表存储的是变长类型的真实数据的占用字节数(逆序).

如果该表没有变长类型, 则无变长字段长度列表

变长字段长度列表只保存 NOT NULL列, 如果该列允许为 NULL, 则不会保存

举例: 字段 0 int 0, 字段1 vachar(10) NOT NULL 'A', 字段2 vachar(10) default NULL 'B', 字段3 vachar(10) NOT NULL 'AA'

变长字段长度列表: 02 01

可通过 变长字段反推字段的长度

复制代码

NULL 值列表

NULL 值列表只统计哪些字段允许为 NULL的值状态(逆序)

如果该表没有允许 NULL 列, 则无 NULL 值列表

MySQL规定NULL值列表必须用整数个字节的位表示,如果使用的二进制位个数不是整数个字节,则在字节的高位补0

二进制位的值为1时,代表该列的值为NULL 二进制位的值为0时,代表该列的值不为NULL

举例: 字段 0 vachar(10) NOT NULL 'A', 字段1 vachar(10) default NULL 'B', 字段2 vachar(10) default NULL NULL, 字段3 vachar(10) default NULL NULL

逆序后: 字段3 - 1, 字段2 - 1, 字段1 - 0

NULL 值列表: 00000110

可通过 NOT NULL 字段反推哪些字段值为 NULL, 哪些字段值不为 NULL

复制代码

记录头

这一部分牵扯的内容较多

大致可以看一下删除标识(删除是并非真正删除, 只是修改表示), 下一条记录位置(B+树特性)

除了这些详细信息, 还会有 MySQL 自动添加的隐藏列

实际上这几个列的真正名称其实是:DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR, 为了美观才写成了row_id、transaction_id和roll_pointer

row_id: 有主键使用主键, 没有主键有唯一键使用唯一键, 没有则自动生成

transaction_id: 事务 ID

roll_pointer: 回滚指针

行溢出

因为一个页占用 16KB, 16 * 1024 = 16384 字节, 而 varchar 最多可以占用65535, 不包括隐藏列和记录头信息

但是在我们使用 varchar 时, 会设置变长字段长度列表和 NULL 值列表

对于 NOT NULL, 只能使用65533字节 (两个字节用来表示长度) 对于非 NOT NULL, 只用使用 65532 字节 (两个字节用来表示长度, 一个字节用来表示 NULL 标识)

对于行溢出的情况, 真实的数据只用存储前 768 字节, 后面放的是溢出页地址

复制代码

行溢出的节点

综上所述, 我们知道在数据的占用字节数超过某个阈值就会发生行溢出, 那么行溢出的计算方式分析如下

ps: 截图来源于MySQL 是怎样运行的:从根儿上理解 MySQL(小孩子 4919)

其他

delete_mask

这个属性标识该条记录是否已删除

如果 MySQL 设计删除一条则执行磁盘删除, 会导致磁盘IO增加, MySQL 为了优化, 使用一个标识表示该记录已被删除, 如果有新的记录来, 会覆盖该条记录

如果想要优化空间, 则执行 optimize table 'name' 即可

参考文献

从根儿上理解mysql_从根儿上理解 MySQL - 页总结相关推荐

  1. window上安装mysql_在window上安装mysql - MySQL5.7.24 版本

    1.下载安装包 下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 备注:选择对应你电脑的版本,现在一般都是64位的电脑 2.解 ...

  2. 服务器上使用mysql_在服务器上安装、使用MySQL的注意事项

    四.用root建一个MYSQL的使用者 你需要先用root登入机器,然后改变目录存取权限chown -R mysql /usr/local/var,接着修改mysql.server 档案,这文件位于/ ...

  3. 从头到尾彻底理解傅里叶变换算法(上)

    从头到尾彻底理解傅里叶变换算法(上) 前言 第一部分.  DFT 第一章.傅立叶变换的由来 第二章.实数形式离散傅立叶变换(Real DFT) 从头到尾彻底理解傅里叶变换算法.下 第三章.复数 第四章 ...

  4. 经典算法研究系列:十、从头到尾彻底理解傅里叶变换算法、上

     经典算法研究系列:十.从头到尾彻底理解傅里叶变换算法.上 作者:July.dznlong   二零一一年二月二十日 推荐阅读:The Scientist and Engineer's Guide t ...

  5. 2018年第13周-虚拟化技术理解(内含Centos7上安装KVM)

    虚拟化技术简介 说道KVM,那必须先提虚拟化技术,我网上查的资料,貌似大家对虚拟化的一些术语没有达成统一的标准,如:仿真.完全虚拟化.超虚拟化.操作系统级虚拟化. 其实我觉得这些术语没有统一,也仅仅是 ...

  6. 从头到尾彻底理解傅里叶变换算法、上

    转自:结构之法 算法之道 网址:https://blog.csdn.net/v_july_v/article/details/6196862   经典算法研究系列:十.从头到尾彻底理解傅里叶变换算法. ...

  7. 【Web技术】1016- 全面理解 8 种文件上传场景

    在日常工作中,文件上传是一个很常见的功能.在项目开发过程中,我们通常都会使用一些成熟的上传组件来实现对应的功能.一般来说,成熟的上传组件不仅会提供漂亮 UI 或好的交互体验,而且还会提供多种不同的上传 ...

  8. [通俗易懂]深入理解TCP协议(上):理论基础

    转自即时通讯网:http://www.52im.net/ 前言 TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的 ...

  9. 在win8上安装mysql_如何在Win8系统上安装MySQL 5.6

    最近发现好多人都想在Win8上安装MySQL,但有些初学者甚至不知道在哪里下载MySQL,大部分都是从百度上搜索其他人或者网站共享的安装包,一般别人共享的包都是.msi的安装包,这种安装包的安装方法就 ...

最新文章

  1. nvidia share有什么用_NVIDIA共享无法在Win10上运行或响应
  2. easyui_动态添加隐藏toolbar按钮
  3. 【已解决】Error: could not open `C:\Program Files\Java\jre1.8.0_121\lib\amd64\jvm.cfg‘
  4. 实现if_数组实现固定栈和队列+栈与队列相互实现
  5. 第三章(循环) 编程题 2
  6. thinkphp 语言包丢失
  7. WINAPI中URLDownloadToFile头文件问题
  8. 2009-03-13读书记录:《Enjoying Web Development with Wickte》三章心得
  9. Windows Sockets错误码方案
  10. 环信移动客服客服昵称头像设置
  11. C# 实现实时网速
  12. 项目管理理论和实施方法论的关系是什么?
  13. html只选择年份,原生jQuery实现只显示年份下拉框
  14. nginx api接口代理配置细节
  15. xcode 调用opencv 摄像头权限问题
  16. springboot前后端分离项目(图书+博客+聊天室)
  17. 共享单车数据处理与分析
  18. C++中的reverse()函数
  19. 国外知名互联网公司的系统设计和推荐算法汇总
  20. html无缝滚动marquee,jquery 模拟marquee无缝滚动

热门文章

  1. IFRAME中嵌入C4C UI
  2. 第三方应用如何在SAP Kyma上进行服务注册
  3. Equipment download和自动生成的IBASE DB 信息
  4. 列出Sell in application所有可以传输的application object
  5. SAP WebIDE 里开发 SAP UI5 应用时,使用 Ctrl + Space 实现代码自动完成功能
  6. SAP成都研究院DevOps那些事
  7. 在Windows 10 系统上启用Hyper V遇到的错误:0x800f0831
  8. 使用JPA + Eclipselink操作PostgreSQL数据库
  9. 能量平衡_能量平衡原则
  10. 动态加载___import__动态加载技术