当前位置: 首页 > 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.dtcms.com/a/295666.html

相关文章:

  • 【Unity开发】飞机大战项目实现总结
  • Unity GC 系列教程第四篇:GC Alloc 优化技巧与实践(下)与 GC 调优
  • DBA常用数据库查询语句(2)
  • 【学习路线】JavaScript全栈开发攻略:前端到后端的完整征程
  • Redis数据库入门教程
  • Windchill用SQL获取所有组织下的所有用户
  • C++11之可变参数模板
  • ac日志报ARP-neighbor-failed问题定位过程
  • langchain+本地embedding模型+milvus实现RAG
  • ChatGPT Agent架构深度解析:OpenAI如何构建统一智能体系统
  • 青少年编程学习的新选择——《CCF GESP 直通车》与《GESP 编程能力等级认证一本通》深度剖析
  • 根据字符串数组的顺序重新排序 List顺序
  • 中国历史朝代顺序以及朝代歌
  • 核心数据结构:DataFrame
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-18,(知识点:传输线阻抗匹配方式)
  • OpenAI最新大模型GPT-4o体验之Code Copilot AI编程大模型
  • 电子书转PDF格式教程,实现epub转PDF步骤
  • Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的深度应用(361)
  • 多模态数据处理系统:用AI读PDF的智能助手系统分析
  • Maven Scope标签:解锁Java项目依赖管理的秘密武器
  • 安全逆向工程学习路线
  • 《Maven 核心基础笔记(第一天)》
  • 使用maven-shade-plugin解决依赖版本冲突
  • gitlab使用 备份恢复 全量迁移
  • 《从点击到共鸣:论坛前端如何用交互细节编织用户体验》
  • window下lua解释器安装并配置vscode环境
  • 【Practical Business English Oral Scene Interpretation】入职面试No.5~7
  • 承担CANOPEN转PROFINET协议转换功能的网关与台达伺服器的连接
  • 80道面试经典题目
  • 循环神经网络(RNN)详解:从原理到实践