当前位置: 首页 > news >正文

MySQL的底层原理--InnoDB记录存储结构

在MySQL当中对数据的读入和写入的功能是在存储引擎上进行执行的,而MySQL的存储引擎则是含有多个存储引擎--innodb,myisam以及memory等存储引擎,在mysql中默认的存储引擎则是innodb引擎,同时这个引擎也是大多数的mysql都会使用的

InnoDB的页简介

innodb是一个表数据存储到磁盘的存储引擎,即使我们关闭重启服务器,数据还是依然存在的。在innodb中真正读取数据是在内存中读取的,而数据的修改也是在内存中修改后再刷新到磁盘当中去。那么我们想要读取数据的时候肯定不会是一条一条的读取这样会太慢了,那么在innodb当中则是通过一页来进行读取数据的,页的大小为16kb。

innodb当中的页大小参数设置则是通过innodb_page_size来进行设置的表明了页的大小,默认是16kb。需要注意的是只有mysql在初始化数据目录的时候该设置才会生效后期再次修改的时候则不会有作用。

InnoDB的行格式

我们平常都是以记录为单位向表中插入数据的,这些记录在磁盘上的存放位置也被称为行格式或者记录格式。设计InnoDB存储引擎的大叔到现在为止设计了4种不同类型的行格式,分别是COMPACT,REDUNDANT,DYNAMIC和COMPRESSED。

我们可以在创造表的时候指定行格式

CREATE TABLE 表名(列的信息) ROW_FORMAT = 行格式名称;ALTER TABLE 表名 ROW_FORMAT = 行格式名称;

COMPACT

目前最主要默认也是使用最多的行格式则是COMPACT格式,下面我们来讲述一下COMPACT格式的组成。

那么在COMPACT则是由两个部分组成分别是额外数据和真实数据

额外数据

首先我们说一下额外信息主要包含三个部分:变长字段长度列表,null值列表,记录头信息

变长字段长度列表:我们知道在行记录中每个字段很有可能出现变长类型的字段也就是varchar类型,那么这个变长字段长度列表则是记录这些变长字段所占用的存储空间是多少。而变长字段则是存储的真实数据,并且在变长字段长度列表当中每个字段的长度顺序是按照逆序存储的

因此变长字段占用的空间分为两个部分:存储的真实数据,该数据占用的字节数

null值列表:我们知道在一些字段的某些列则会存储null值,那么这个null值列表字段则是按照位来存储该列数据是否为null的(把一条数据的null值统一管理起来,存储到null值列表中去)

二进制的值为1时候则代表这个值为null,二进制的值为0的时候则代表这个值不为null。

记录头信息:这个字段则是主要记录当前数据行的一些信息情况,主要有下述信息。

字段名称长度(位)描述
unused1未使用(保留位)
delete_mask1删除标记:0 = 未删除,1 = 已删除(逻辑删除,物理空间未释放)
min_rec_mask1最小记录标记(用于索引页,表示该记录是 B+ 树中某个层级的最小记录)
n_owned4记录所属的 “组” 大小(InnoDB 将相邻记录分组,每组由一个 “领导记录” 管理)
heap_no13记录在页内的堆(Heap)中的位置编号(非索引顺序,用于内存管理)
record_type3记录类型:
0 = 普通记录,1 = 目录项记录,2 = 最小记录,3 = 最大记录
next_record16指向下一条记录的相对偏移量(形成页内记录链表,按主键或索引顺序排列)

真实数据

在mysql表中真实数据则是含有三个隐藏列分别是row_id,trx_id,roll_pointer三个字段

row_id则是表自动生成的主键id,如果当前表没有设置主键id,并且还不具有不为空并且不可重复的列,那么在创建表的时候数据库会自动生成一个隐藏列将此列当作主键id

trx_id则表示事务id,因为mysql每次开启一个事务都会自动生成一个事务id,而这个trx_id则是当前数据最后执行的事务id

roll_pointer回滚指针,这个字段则是存放着一个指针,来指向修改后的数据

http://www.lryc.cn/news/599032.html

相关文章:

  • Ollama(5)服务接口压力测试
  • PostgreSQL 保留关键字冲突问题:语法错误 在 “user“ 或附近的 LINE 1: CREATE TABLE user
  • Windchill用SQL获取所有组织下的所有用户
  • CIRL:因果启发的表征学习框架——从域泛化到奖励分解的因果革命
  • Linux进程间通信:管道机制全方位解读
  • 【MediaTek】AN7563编译wlan_hwifi出现en_npu.c:42:10: fatal error:
  • 【STM32项目】水质检测
  • 【数组的定义与使用】
  • 使用Python采集招聘网站数据并智能分析求职信息
  • AI大模型各类概念扫盲
  • 【C++】标准模板库(STL)—— 学习算法的利器
  • 算法题(179):单调栈
  • C++抽象类完全指南
  • ARM汇编常见伪指令及其用法示例
  • Datawhale AI数据分析 作业2
  • linux入门 相关linux系统操作命令(二)--文件管理系统 ubuntu22.04
  • DS18B20扩展:在数码管上显示温度时包含小数部分
  • MPI并行梯形积分法:原理、实现与优化指南
  • 【PyTorch】图像二分类项目-部署
  • 从零开始学 Pandas:数据处理核心操作指南
  • 清除浮动以及原理
  • cri-docker部署高版本k8s
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十四课——车牌识别的FPGA实现(6)叠加车牌识别的信息
  • 5.7 input子系统
  • RocketMQ集群高级特性
  • 洛谷刷题7.24
  • 办公自动化入门:如何高效将图片整合为PDF文档
  • 精通Python PDF裁剪:从入门到专业的三重境界
  • 读书笔记(黄帝内经)
  • 【CMake】CMake 常用语法总结