MySQL-InnoDB数据存储结构

1、存储结构-页

索引结构提供了高效的索引方式,索引信息以及数据记录都保存在数据文件或索引文件中(本质存储在页结构中)

1.1、磁盘与内存交互的基本单位:页

  • 在InnoDB中将数据划分为若干页,页的默认大小为:16KB
  • 不论读多少条数据,都是将这些数据所在的页进行加载。磁盘I/O操作最小单位是页。

1.2、页的结构

  • 相关数据页可以不在物理结构上相连,通过双向链表相关联。
  • 每个数据页中的数据记录会按照主键值的大小进行排序,组成一个单向链表
  • 每个数据页都会为存储的数据记录生成一个目录页,通过主键值查找是可以在目录页通过二分法快速定位相关数据记录

1.3、页的大小

  • 通过查找 innodb_page_size参数获取和设置
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
1 row in set (2.89 sec)

1.4、页的上层结构

在这里插入图片描述

  • 区:是比页大一级的存储结构(默认1MB),在InnoDB存储结构中,一个区会分配64个连续的页
  • 段:由一个或多个区组成,区在文件系统是一个连续分配的空间,并不要求区和区之间是相邻的。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。创建表时会创建一个表段,创建索引时会创建一个索引段
  • 表空间:是一个逻辑容器,存储的对象是段,在一个表空间中可以有一个或者多个段,一个段只能属于一个表空间。数据库由一个或多个表空间组成,表空间从管理上可以划分为:系统表空间,用户表空间,撤销表空间,临时表空间等

2、页的内部结构

名称占用大小说明
文件头38字节描述页的信息
页面头部56字节页的状态信息
最大(小)用户26字节为两个虚拟的行记录
用户记录不确定存储行记录内容
空闲空间不确定页中还没有被使用的空间
页目录不确定存储用户记录的相对位置
文件尾8字节校验页是否完整

2.1、文件头(File Header)

  • 文件头存储了一些全局性的信息,如文件版本、页大小、文件ID等。
  • 文件头的大小通常是固定的,对于InnoDB的页,文件头大小是固定的38字节。
  • 文件头位于每个数据文件的开头,用于标识文件的类型和属性。
  • 主要划分为以下结构:
    • FIL_PAGE_SPACE_OR_CHKSUM(页的校验和):4字节,用于对页的内容进行校验,以确保数据完整性和防止损坏。

    • FIL_PAGE_OFFSET(页号):4字节,每个页都有一个唯一的页号,InnoDB通过页号可以定位到具体的页。

    • FIL_PAGE_PREV(上一个页的页号):4字节,指示上一个页的页号,保证了页之间的逻辑连续性。

    • FIL_PAGE_NEXT(下一个页的页号):4字节,指示下一个页的页号,同样保证了页之间的逻辑连续性。

    • FIL_PAGE_LSN(页面最后被修改的日志序列位置):8字节,记录了页面最后一次被修改时的日志序列位置(LSN)。

    • FIL_PAGE_TYPE(该页的类型):2字节,指示该页的类型,可能包括数据页、索引页等。

    • FIL_PAGE_FILE_FLUSH_LSN(独立表空间中都是0):8字节,用于记录独立表空间中的文件刷新LSN,对于非独立表空间该字段可能有其他用途。

    • FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID(页属于哪个表空间):4字节,用于指示页属于哪个表空间。

2.2、用户记录(User Records)

  • 实际存储在页中的数据和索引条目。
  • 这些记录按照B+树的结构组织在页中,叶子节点存储数据记录,非叶子节点存储索引记录。
  • 记录可以是固定长度或变长,根据存储的数据类型和大小而定。
  • 主要划分为以下结构:
    • delete_mask: 1字节, 标记该记录是否被删除,
      • 0 表示记录没有删除,
      • 1 表示记录被删除了
    • min_rec_mask :1字节, B+数的每非叶子节点中的最小纪录数都会添加该标记
      • 只有最小纪录数的min_rec_mask 值为1
      • 其他别的记录min_rec_mask 值为0
    • n_owned: 4字节,如果当前记录是组内最大记录,则代表槽内的记录数
    • heap_no :13字节 当前记录在本页中的位置信息
      • 最小记录的heap_no值:0
      • 最大记录的heap_no值:1
    • record_type: 3字节, 表示当前记录的类型
      • 0表示普通记录
      • 1表示B+树非叶子节点记录
      • 2表示最小记录
      • 3表示最大记录
    • next_record 16字节 表示从当前记录的真实数据到下一条记录的真实数据的地址偏移量。

2.3、最大(小)记录

  • 由5字节大小的记录投信息和8个字节大小的一个固定的部分组成
  • 本页中主键值最小的用户记录的下一条记录就是Infimum记录(也就是最小记录)
  • 本页中主键值最大的用户记录的下一条记录就是Supremum记录a(也就是最大记录)。

2.4、空闲空间(Free Space)

  • 空闲空间是页中未被使用的部分,用于存储新的数据和索引。
  • 当页中的自由空间不足时,InnoDB会进行页分裂操作,将页分成两个更小的页,以便腾出更多的空间。

2.5、页目录(Page Directory)

  • 页目录记录了页中数据和索引的偏移量及长度信息,以便InnoDB能够快速地定位和访问这些数据和索引。
  • 页目录是由多个槽(Slot)组成的数组,每个槽存储一个记录的偏移量和长度信息。
  • 页目录通常位于页头之后,占据了页的一部分空间
  • 所以在一个页中根据主键查找记录是很快的,步骤为两步:
    • 二分法确定该记录所在的槽,并找到该槽所在分组中主键值最小的那条记录。
    • 通过记录的 next_record 属性遍历该槽所在的组中的各个记录

2.6、页面头部(Page Header)

  • 记录数量(Number of Records):记录了本页中已经存储的记录数量。
  • 第一条记录的地址(Address of First Record):记录了本页中第一条记录的地址或偏移量,以便快速定位到第一条记录。
  • 页目录中槽的数量(Number of Slots in Page Directory):记录了页目录中存储的槽的数量,即页目录中有多少个条目。
  • 页目录起始地址(Address of Page Directory):记录了页目录的起始地址或偏移量,以便快速定位到页目录。
  • 其他状态信息(Other Status Information):可能还包括其他与页相关的状态信息,如空闲空间大小、最大记录偏移量等。
  • 通常包含以下信息:
名称占用空间大小描述
PAGE_N_DIR_SLOTS2字节页目录中的槽数量
PAGE_HEAP_TOP2字节还未使用的空间最小地址,该地址之后就是 Free Space
PAGE_N_HEAP2字节本页中的记录的数量(包括最大最小和标记为删除的记录)
PAGE_FREE2字节指向可重用空间的地址
PAGE_GARBAGE2字节已删除记录占用的字节数
PAGE_LAST_INSERT2字节最后插入记录的位置
PAGE_DIRECTION2字节最后插入的方向
PAGE_N_DIRECTION2字节一个方向连续插入的记录数量
PAGE_N_RECS2字节该页中记录的数量(不包括最大最小和标记为删除的记录)
PAGE_MAX_TRX_ID2字节修改当前页的最大事务ID,该值仅在二级索引中定义
PAGE_LEVEL2字节当前页在索引树(B+树)中的层级
PAGE_INDEX_ID8字节索引ID,表示当前页属于哪个索引
PAGE_BTR_SEG_LEAF10字节B+树叶子段的头部信息,仅在B+树的Root页定义
PAGE_BTR_SEG_TOP10字节B+树叶子段的头部信息,仅在B+树的Root页定义

2.7 文件尾(File Trailer)

  • 文件尾是文件的结束部分,通常用于存储一些结束标识或校验信息。
  • 文件尾的大小通常是固定的,对于InnoDB的数据文件,文件尾大小是8字节。
  • 通常划分为以下结构:
    • 前4个字节代表页的校验和,这个部分和 File Header 中的校验和相对应
    • 后4个字节代表页面被最后修改时对应的日志序列位置(LSN),这个部分也是为了校验页的完整性的,如果首部和尾部的LSN值校验不成功的话,就说明同步传输过程出现了问题。

3、行格式(记录格式)

3.1 查询InnoDB引擎的默认行格式

  • 语法如下:
mysql> show variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name             | Value   |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.13 sec)
  • 查看已创建表的行格式:
mysql> show table status like 'rqtanc_test'\G
*************************** 1. row ***************************Name: rqtanc_testEngine: InnoDBVersion: 10Row_format: DynamicRows: 0Avg_row_length: 0Data_length: 16384
Max_data_length: 0Index_length: 0Data_free: 0Auto_increment: NULLCreate_time: 2024-04-22 06:24:10Update_time: NULLCheck_time: NULLCollation: utf8mb4_0900_ai_ciChecksum: NULLCreate_options: Comment: 
1 row in set (0.00 sec)

3.2、指定行格式

  • 创建表时指定行格式:
mysql> create table rqtanc_one(id int not null,col int null) row_format=compact;
  • 修改表时指定行格式:
mysql> alter table rqtanc_one row_format = dynamic;
Query OK, 0 rows affected (0.82 sec)

3.3、分类及相关相关详情描述

参考官方文档

4、表空间

参考 MySQL-数据目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack并行构建示例:

由于js的单线程特性,文件和任务时 要等待一个任务执行完成后执行下一个任务,但在实际开发中,很多任务是可以并行执行的(如同时处理多个不同js文件或同事压缩多张图片),一些loader和插件(thread-…

【数据结构】解密链表之旅(单链表篇)

前言 哈喽大家好,我是野生的编程萌新,首先感谢大家的观看。数据结构的学习者大多有这样的想法:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学的很累。我想让大家知道…

自制无感无刷电机驱动板

自制无感无刷电机驱动板 分别测试了基于C251的STC32G单片机、Arduino AVR的ATmega328PB、以及ARM的ST32F103单片机。 🧲测试转动效果 ✒目前市面上开源的有关无刷电机的项目数不胜数,其控制原理都大同小异,在没有领透其技术要领情况下&#x…

苍穹外卖项目---------收获以及改进(9-12)

①Spring Task-------实现系统定时任务 概念: 应用场景: 使用步骤: 实现订单超时和前一天派送中的订单的自动任务处理: Component Slf4j public class Mytask {Autowiredprivate OrderServiceimpl orderServiceimpl;/*** 处理订…

yarn 安装以及报错处理

前一种报错是由于没有安装yarn导致的,使用以下命令即可安装: npm install -g yarn 如果成功安装,将显示Yarn的版本号。 yarn --version 第二种报错是因为系统上的执行策略限制导致的。执行策略是一种安全功能,用于控制在计算机…

grafana10.x报错 Failed to upgrade legacy queries Datasource x was not found

问题 grafana 从6.x升级到10.x后,导入json文件后报错,数据源x查询不到,grafana不显示数据; Templating Failed to upgrade legacy queries Datasource x was not found解决方法 可能grafana升级后数据源找不到,在面板…

上海市计算机学会竞赛平台2023年10月月赛丙组三个数的中位数

题目描述 给定三个整数,请输出按大小排序后,位于正中间的数字。 输入格式 第一行:三个整数 𝑎a, 𝑏b 与 𝑐c 输出格式 第一行:单个整数表示三者的中位数 数据范围 −10000≤&#x1d44e…

CentOS7 源码编译 rtpengine9.5.8

CentOS7 不好搞,但应客户要求,不得不搞 选择 rtpengine9.5.8 版本而不是更新的版本,肯定是有自己的考虑的 不废话了,直接上脚本: #!/bin/bash# CentOS7 最小安装yum -y install epel-release yum -y install git gc…

Kafka官方文档中文版+Kafka面试题详解!

你了解kafka吗?目前它在一线互联网公司以迅雷不及掩耳之势得到了广泛的应用。但究竟是什么呢?Kafka最初于2011年在LinkedIn开发,自那时起经历了很多改进。如今它是一个完整的平台,允许您冗余地存储荒谬的数据量,拥有一…

SH150S1光电吊舱

SH150S1光电吊舱 1产品应用 SH150S1是一款三轴三光吊舱,集成了最远测程达3.0km,精度小于2米的半导体激光测距机,640512高分辨率红外相机,30倍光学变倍可见光相机以及高稳定精度平台框架;可安装于中小型无人机&#x…

【每日刷题】Day40

【每日刷题】Day40 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 202. 快乐数 - 力扣(LeetCode) 2. 217. 存在重复元素 - 力扣(Le…

vue2 报错,警告 解决方法 component name“Index“should always be multi-word

报错原因: 组件名称应该为俩个或俩个以上单词组成的,并且还要是大驼峰命名,例如:MyIndex,MyLogin等 解决方法一: 将组件名称改为俩个或俩个以上单词组成的名称,且为大驼峰命名,例如…

前端手写练习题及概念加深

通过举例和实际例子来加深前端的概念形式 1. 手写reduce 用法: // 手写 reduce const a [1, 3, 6, 8]const sum a.reduce((accu, curr) > accu curr, 0) console.log(sum, sum ) 在注释中解释 reduce 的手写方法 // 1. 明确参数累加函数,接受…

Django 和 Spring Boot

标题 Django (Python)Django提供的组件Django 的处理逻辑 Spring Boot (Java)Spring Boot 的特点Spring Boot 的处理逻辑 MVC设计模式模型(Model)视图(View)控制器(Controller)逻辑处理过程 Django 和 Spri…

Postman基础功能-Collection集合和批量运行

一、Collection(集合)介绍 当我们对一个或多个系统中的很多接口用例进行维护时,首先想到的就是对接口用例进行分类管理,同时还希望对这批接口用例做回归测试。 在 Postman 中也提供了这样一个功能,就是 Collec…

免费的GPT4终于要来了!OpenAI直播发布会详细解读!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

Docker下载镜像出现“missing signature key”如何解决?

“missing signature key” 通常与 Docker 配置有关,具体是 Docker 试图验证镜像的签名但未能找到相应的密钥。这种情况可能发生在启用了 Docker Content Trust (DCT) 的环境中,DCT 是一种安全功能,要求所有镜像必须有签名才能拉取。 原因 …

刚刚OpenAI发布ChatGPT-4o模型,免费使用GPT4o并免费提供更多功能

就在今日凌晨1点,OpenAI举行了春季发布会,发布了GPT-4o 并免费提供更多功能。 亲测GPT-4o已经可以免费试用,每个人都可以使用它并从中受益,GPT4终于不再是少部分人的玩物。 点击加入ChatGPT4交流群:https://www.aijour…

体彩、福彩中奖概率分析

体彩和福彩的中奖概率分析是一个涉及概率论、数理统计以及彩票玩法规则的复杂话题。 但我可以提供一个大致的框架和要点,供您参考和扩展。 一、引言 在引言部分,可以简要介绍彩票的起源、发展和在中国的影响。阐述彩票作为一种特殊的商品,其销售和购买过程中的中奖概率是吸…

微信小程序发送订阅消息sendMessage

微信小程序发送订阅消息sendMessage 请注意订阅消息一次性订阅只只能授权一次接受一条消息多次授权会累加接受次数,wx.requestSubscribeMessage调用授权 目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放 //授权弹框,只弹出…