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。

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

sql 复制代码
CREATE TABLE 表名(列的信息) ROW_FORMAT = 行格式名称;

ALTER TABLE 表名 ROW_FORMAT = 行格式名称;

COMPACT

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

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

额外数据

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

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

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

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

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

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

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

真实数据

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

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

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

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

相关推荐
极限实验室6 小时前
APM(一):Skywalking 与 Easyearch 集成
数据库·云原生
饕餮争锋6 小时前
SQL条件中WHERE 1=1 的功能
数据库·sql
玄斎7 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
编织幻境的妖7 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
编程小Y8 小时前
MySQL 与 MCP 集成全解析(核心原理 + 实战步骤 + 应用场景)
数据库·mysql·adb
零度@8 小时前
SQL 调优全解:从 20 秒到 200 ms 的 6 步实战笔记(附脚本)
数据库·笔记·sql
Miss_Chenzr8 小时前
Springboot优卖电商系统s7zmj(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
lvbinemail8 小时前
Grafana模板自动复制图表
数据库·mysql·zabbix·grafana·监控
Miss_Chenzr8 小时前
Springboot旅游景区管理系统9fu3n(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·旅游
小虾米vivian9 小时前
dmetl5 运行失败,提示违反协议?
数据库·达梦数据库