当前位置: 首页 > 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.xdnf.cn/news/1178407.html

相关文章:

  • Mysql大数据架构设计:当表中数据超过800万时,对数据表进行分表操作,以及分页查询优化详解
  • C++扩展 --- 并发支持库(下)
  • 【YOLO系列】YOLOv4详解:模型结构、损失函数、训练方法及代码实现
  • PA333H-2K功率计:光伏行业高压测试“刚需”
  • 智慧驾驶疲劳检测算法的实时性优化
  • ARM 学习笔记(四)
  • 嵌入式软件--stm32 DAY 9 定时器
  • Springmvc的自动解管理
  • 一文说清楚Hive中常用的聚合函数[collect_list]
  • 一文读懂 HTTPS:证书体系与加密流程
  • Percona pt-archiver 出现长事务
  • GISBox实操指南:如何将IFC文件高效转换为3DTiles格式‌‌
  • 【MAC电脑系统变量管理】
  • 基于Zig语言,opencv相关的c++程序静态交叉编译
  • 微服务-springcloud-springboot-Skywalking详解(下载安装)
  • 设置后轻松将 iPhone 转移到 iPhone
  • 基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
  • Socket编程入门:从IP到端口全解析
  • C语言(长期更新)第5讲:数组练习(三)
  • Apache 消息队列分布式架构与原理
  • 开发避坑短篇(5):vue el-date-picker 设置默认开始结束时间
  • LLM层归一化:γβ与均值方差的协同奥秘
  • 力扣面试150题--在排序数组中查找元素的第一个和最后一个位置
  • 5.7 input子系统
  • 「Linux命令基础」查看用户和用户组状态
  • Silly Tavern 教程②:首次启动与基础设置
  • 文件管理困境如何破?ZFile+cpolar打造随身云盘新体验
  • Apache Flink 实时流处理性能优化实践指南
  • TRUMPF TruConvert DC 1008 – 1010 TruConvert System Control 逆变器
  • 货车手机远程启动的扩展功能有哪些