MySQL 数据目录和 InnoDB 表空间补充知识:详细结构
1. 数据目录
在Ubuntu下,MySQL的数据目录为/var/lib/mysql
1.1 数据库在文件系统中的表示
(1)创建数据库时,会在数据目录下创建一个与数据库名同名的子目录。(除了information_schema
这个系统数据外)
(2)db.opt文件存储数据库的一些属性
MySQL 8.0 之后不再提供
1.2 表在文件系统中的表示
(1)表结构定义。表名.frm
文件
(2)表数据
1.2.1 InnoDB
(1)系统表空间。只有一份,默认为数据目录下的ibdata1
文件
(2)独立表空间;表名.ibd
文件。
MySQL 8.0将ibd文件和frm文件合并,只有一个ibd文件,并且不再提供db.opt文件,其中的字符集、比较规则信息也放在ibd文件中。
存储到系统表空间中的表转移到独立表空间
ALTER TABLE 表名 TABLESPACE innodb_system
存储在独立表空间中的表转移到系统表空间
ALTER TABLE 表名 TABLESPACE innodb_file_per_table
1.2.2 MyISAM
表名.MYD
、表名.MYI
分别表示表的数据文件和索引文件
2. InnoDB的表空间
2.1 页面通用部分
每个页都包含了File Header
和File Trailer
(1)FIL_PAGE_OFFSET
表空间下描述页号,4字节,因此一个表空间最多 64TB,即 (2^32)*16KB
(2)FIL_PAGE_PREV
和 FIL_PAGE_NEXT
上/下页的页号,主要是数据页(INDEX 类型)使用。
(3)FIL_PAGE_TYPE
据此区分页的类型
2.2 独立表空间结构
表空间划分为一个一个的区(每个 1 MB),每 256 个区组成一个组。
(1)第一个组最开始的 3 个页面的类型是固定的。
- FSP_HDR:整个表空间中只有一个 FSP_HDR 类型的页面;登记表空间的一些整体属性和本组索引的区。
File Space Header | 共 112 字节 | |
---|---|---|
Space ID | 4 | 表空间 ID |
Not Used | 4 | 未使用,可忽略 |
Size | 4 | 拥有的页面数 |
FREE Limit | 4 | 尚未被初始化的最小页号,该字段表示页号之后的区都未被使用,且没有加入到 FREE 链表中 |
Space Flags | 4 | 页面大小,是否为共享/临时表空间等属性 |
FRAG_N_USED | 4 | FREE_FRAG 链表中已使用的页面数量 |
List Base Node for FREE list | 16 | FREE 链表基节点 |
List Base Node for FREE_FRAG list | 16 | FREE_FRAG 链表基节点 |
List Base Node for FULL_FRAG list | 16 | FULL_FRAG 链表基节点 |
Next Unused Segment ID | 8 | 当前表空间中下一个未使用的 Segment ID,递增 |
List Base Node for SEG_INODES_FULL list | 16 | SEG_INODES_FULL 链表基节点 |
List Base Node for SEG_INODES_FREE list | 16 | SEG_INODES_FREE 链表基节点 |
- INODE:存储 INODE Entry 数据结构
每个段对应的 INODE Entry 结构会存储到 INODE 页中。段特别多的情况下。会有多个 INODE 页,会组成链表。
SEG_INODES_FULL :在该链表中的 INODE 页没有空闲空间
SEG_INODES_FREE :有空闲空间
如果新建一个段时,SEG_INODES_FREE 链表为空,需要从表空间的 FREE_FRAG链表申请一个页面,并把页面的类型修改为 INODE。
(2)其余各组最开始的 2 个页面的类型是固定的。
XDES:登记本组 256 个区的属性。
2.2.1 段
一些零散页面以及一些完整区的集合
(1)为什么使用区?
一个区是连续的 64 页。在表中数据量很大时,为某个索引分配空间按照区为单位,这样就尽量让页面链表中相邻的页的物理位置也相邻。
(2)对 B+ 树的叶子节点和非叶子节点进行了区分。会生成一个叶子节点段和一个非叶子节点段(一个索引会生成两个段),段是以区为单位申请存储空间的
(3)以区为单位申请空间,对小表会造成浪费存储空间;提出了碎片区
碎片区只需于表空间,不属于任何段。
碎片区中的页可以用于不同的目的,可以属于不同段。
在刚开始向表中插入数据时,段是从碎片区的以页为单位分配存储空间的,当某个段已经占用了 32 个碎片区页面后,就会以区为单位来分配。(原先占用的碎片区的页面不会被复制到新申请的区中)
2.2.2 区
区可分为 4 种类型,这也是 4 种状态(State)
- FREE;空闲的区
- FREE_FRAG;有剩余空间页面的碎片区
- FULL_FRAG;没有剩余空间页面的碎片区
- FSEG;附属于某个段的区
前三种是独立的,直属于表空间
(1)为了方便管理区,设计每个区都对应一个 XDES Entry 的结构(40 字节)。
- Segment ID (8 字节);段的 ID,前提是分配给了某个段。
- List Node (12 字节);
指向 前/后一个 XDES Entry 的指针 (Page Number + Offset); - State(4 字节);
- Page State Bitmap(16 字节);每个区有 64 页,每页用 2 位表示,表明对应的页是否是空闲。
(2)之所以 XDES Entry 要组成链表,是因为可以把状态分别为 FREE、FREE_FRAG、FULL_FRAG 的区对应的 XDES Entry 结构连接成一个 FREE、FREE_FRAG、FULL_FRAG 链表。
段中数据较少时,首先查看表空间中是否有状态为 FREE_FRAG 的区,如果有,则从该区中取下一个零散页把数据插进去;否则到表空间中申请一个状态为 FREE 的区,把该区的状态变为 FREE_FRAG ,然后从该区中取出一个零散页把数据插入进去。
该区中没有空闲页面后,将其状态变成 FULL_FRAG。
(3)段中数据已经占满了 32 个零散的页后,申请完整的区。
根据段号来区分各个段,对每个段都建立 3 个链表
- FREE 链表;所有页面都是空闲的区
- NOT_FULL 链表;仍有空闲页面的区
- FULL 链表;已经没有空闲页面的区
(4)链表基节点
每个链表对应一个 List Base Node 结构(16字节)
- List Length;表明链表一共有多少个节点;
- First Node Page;该链表的头结点在表空间中的位置;
- Last Node Page;该链表的尾结点在表空间中的位置;
2.2.3 段的结构
为每个段定义一个 INODE Entry 结构。
- Segment ID;对应的段的编号;
- NOT_FULL_N_USED;在 NOT_FULL 链表中已经使用了多少个页面;
- 3 个 List Base Node;分别为 FREE、NOT_FULL 、FULL 链表基节点
- Magic Number
- Fragment Array Entry;共有 32 个,每个 Fragment Array Entry 结构对应一个零散的页面,这个结构一共 4 字节,表示一个零散页面的页号。
2.2.4 Segment Header
(1)索引会对应两个段,如何知道某个索引和某个段之间的对应关系?
在数据页的 Page Header 中,属性 PAGE_BTR_SEG_LEAF
和 PAGE_BTR_SEG_TOP
仅在 B+ 树的根页中定义,分别记录了叶子/非叶节点段的头部信息(Segment Header,其中包含表空间ID,页面号,偏移量);
2.3 系统表空间
整个 MySQL 进程只有一个系统表空间,其表空间 ID 为 0。
页号 | 页面类型 | 描述 |
---|---|---|
3 | SYS | 存储 Change Buffer 的头部信息 |
4 | INDEX | 存储 Change Buffer 的根页面 |
5 | TRX_SYS | 事务相关信息 |
6 | SYS | 第一个回滚段信息 |
7 | SYS | 数据字典头部信息 |
extent 1 和 extent 2 这两个区,是作为 Doublewrite Buffer;
2.3.1 数据字典
由系统表来记录一些元数据(某个表中有多少列,该表有哪些索引等信息)。这些系统表被称为数据字典,都是以 B+ 树的形式保存在系统表空间的某些页面中。
以下四个为基本系统表
(1)SYS_TABLES;整个 InnoDB 存储引擎中所有表的信息
列名 | 描述 |
---|---|
NAME | 表名 |
ID(TABLE_ID) | 表的 ID(每个表具有唯一的 ID) |
N_COLS | 表中列的个数 |
TYPE | 类型,记录文件格式、行格式、压缩等信息 |
MIX_ID | 忽略 |
MIX_LEN | 额外属性 |
CLUSTER_ID | 忽略 |
SPACE | 所属表空间的 ID |
以 NAME 列为主键的聚簇索引;
以 ID 列建立的二级索引;
(2)SYS_COLUMNS;所有列的信息。
列名 | 描述 |
---|---|
TABLE_ID | 该列所属表的 ID |
POS | 表明是第几列 |
NAME | 列名 |
MTYPE | 列的数据类型(INT、CHAR等) |
PRTYPE | 精确数据类型,修饰主数据类型的,例如是否允许 NULL 等 |
LEN | 该列最多占用的字节数 |
PREC | 精度,默认为 0 |
以 (TABLE_ID ,POS)列为主键的聚簇索引
(3)SYS_INDEXES;所有索引的信息。
列名 | 描述 |
---|---|
TABLE_ID | 该索引所属表的 ID |
ID(INDEX_ID) | 索引 ID |
NAME | 索引名 |
N_FIELDS | 索引包含几列 |
TYPE | 索引类型,例如聚簇索引、唯一二级索引、更改缓冲区的索引、全文索引、普通二级索引 |
SPACE | 索引根页面所在的表空间 ID |
PAGE_NO | 索引根页面所在的页面号 |
MERGE_THRESHOLD | 指明 B+ 树发生合并时的比例(页面满发生分裂,数据太少发生合并) |
以 (TABLE_ID ,ID)列为主键的聚簇索引
(4)SYS_FIELDS;索引对应列的信息。
列名 | 描述 |
---|---|
INDEX_ID | 该列所属索引的 ID |
POS | 该列在索引列中是第几列 |
COL_NAME | 对应列的名称 |
以 (INDEX_ID,POS)列为主键的聚簇索引
(5)由页号为 7 的页面,记录了 Data Dictionary Header。记录上述 4 个表的聚簇索引和二级索引对应的 B+ 树根页面的位置。
Max Row ID:隐藏主键的 ID 号,自增并且是全局共享的,即拥有 row_id 列的不同表之间的这个值也都是不同的。
Max Table ID:自增的表 ID 值。
之后记录了这些索引根页面的页号,对应上述 4 个表中的索引。
把数据字典信息当成一个段来分配存储空间,该段只有一个碎片页,即页号为 7 的页。
(6)information_schema 系统数据表
在存储引擎启动时读取这些 SYS 开头的系统表,然后填充到以 INNODB_SYS 开头的表中。
参考书籍
《MySQL 是怎样运行的》
相关文章:

MySQL 数据目录和 InnoDB 表空间补充知识:详细结构
1. 数据目录 在Ubuntu下,MySQL的数据目录为/var/lib/mysql 1.1 数据库在文件系统中的表示 (1)创建数据库时,会在数据目录下创建一个与数据库名同名的子目录。(除了information_schema这个系统数据外) &…...

移远EC600U-CN开发板 day02
1.QuecPythonLVGL显示图片 由于官方提供的显示图片函数使用失败,为了能在屏幕上显示图片,通过对出厂脚本的分析,成功使用LVGL显示图片 (1)代码 import lvgl as lv from tp import gt9xx from machine import LCD from machine import Pin …...

visual studio Python 配置QGIS(qgis)教程
visual studio Python 配置QGIS(qgis)教程 这个教程全网独一份啊,博主是自己摸索出来的。 visual studio Python 配置QGIS(qgis)环境一共分为两部: 第一步安装QGIS: 下载链接如下 https://www…...

第二证券:消费电子概念活跃,博硕科技“20cm”涨停,天龙股份斩获10连板
消费电子概念7日盘中再度拉升,到发稿,博硕科技“20cm”涨停,光大同创、波长光电涨超10%,易德龙、向阳科技、得润电子、天龙股份、同兴达等涨停。 博硕科技强势涨停,公司昨日在接受安排调研时表明,公司从上…...

petalinux 2022.2 在 ubantu18.04 下的安装
下载 Ubuntu下载: https://releases.ubuntu.com/18.04/ubuntu-18.04.6-desktop-amd64.iso petalinux 下载: https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools/2022-2.html 安装虚拟机 安装…...
【进程与线程】进程与线程 QA
进程与线程常见知识点: 1、什么是进程、线程,有什么区别? 进程是资源(CPU、内存等)分配的基本单位,线程是CPU调度和分配的基本单位程序执行的最小单位)。同一时间,如果CPU是单核,只有一个进程在执行,所谓…...

电脑风扇控制软件 Macs Fan Control Pro mac中文版功能介绍
Macs Fan Control mac是一款专门为 Mac 用户设计的软件,它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度,以提高设备的散热效果,减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温…...
【13】c++11新特性 —>call_once
在某些特定情况下,某些函数只能在多线程环境下调用一次,比如:要初始化某个对象,而这个对象只能被初始化一次,就可以使用std::call_once()来保证函数在多线程环境下只能被调用一次。使用call_once()的时候,需…...
解决logstash插件logstash-outputs-mongodb一条数据失败后一直重复尝试
描述 从日志中读取数据时,有一条数据不符合规范,导致logstash读取数据插入时出错,而插件又无限尝试插入,导致堵塞。 解决方案 找到logstash文件夹目录,例如是:/data/logstash-7.3.2 cd /data/logstash-…...

【网络协议】聊聊HTTPDNS如何工作的
传统 DNS 存在哪些问题? 域名缓存问题 我们知道CND会进行域名解析,但是由于本地会进行缓存对应的域名-ip地址,所以可能出现过期数据的情况。 域名转发问题 出口 NAT 问题 域名更新问题 解析延迟问题 因为在解析DNS的时候,需要进行…...

TikTok与老年用户:社交媒体的跨代交流
在数字时代,社交媒体已成为人们沟通、分享和互动的主要平台。然而,社交媒体不再仅仅局限于年轻一代,老年用户也逐渐加入其中。 其中,TikTok是一个引领潮流的短视频社交媒体应用,正在吸引越来越多的老年用户。本文将探…...
如何在Linux机器上使用ssh远程连接Windows Server服务器
如何在Linux机器上使用ssh远程连接Windows Server服务器 一、源起二、使用ssh远程连接Windows1.先决条件(1)至少运行 Windows Server 2019 或 Windows 10(内部版本 1809)的设备。(2)PowerShell 5.1 或更高版…...
NLP常见任务的分类指标
自然语言处理(NLP)任务的评估指标因任务类型和目标而异。以下是一些常见的 NLP 任务以及相应的评估指标: 1、 文本分类任务: 准确率(Accuracy):分类正确的样本数量与总样本数量的比例。 精确率…...

node插件express(路由)的插件使用(二)——body-parser和ejs插件的基本使用
文章目录 前言一、express使用中间件body-parser获取请全体的数据1. 代码2. 效果 二、express使用ejs(了解即可)1.安装2.作用3.基本使用(1)代码(2)代码分析和效果 4.列表渲染(1)代码…...

学习c++的第十天
目录 类 & 对象 类定义 对象的建立和使用 构造函数(Constructor) 析构函数(Destructor) 拷贝构造函数 扩展知识 this指针 友元函数的使用方法 友元类的使用方法 常数据的使用及初始化 类 & 对象 什么是类?什么是对象?对于面向对象的…...

895. 最长上升子序列
题目: 895. 最长上升子序列 - AcWing题库 思路:dp 代码: #include<iostream> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; const int N1010; int f[N];//表示以i结尾的最大上升子序列…...

岩土工程铁路桥梁监测中智能振弦传感器的应用方案
岩土工程铁路桥梁监测中智能振弦传感器的应用方案 智能振弦传感器是近年来岩土工程和桥梁监测领域的重要技术之一。它具有高灵敏度、高精度、高可靠性等优点,并且能够实时对结构物振动进行监测和分析。本文针对岩土工程铁路桥梁监测中智能振弦传感器的应用方案进行…...

【数智化人物展】觉非科技CEO李东旻:数据闭环,智能驾驶数智时代发展的新引擎...
李东旻 本文由觉非科技CEO李东旻投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 数智化的主要作用是帮助决策。它的核心是大数据,以大数据为基础,匹配合适的AI技术,促使数…...

字符型液晶显示器LCD 1602的显示控制(Keil+Proteus)
前言 趁机把LCD 1602的实验完成了,那个电路图有几个地方没弄懂,但是去掉也没有报错,就没管了。 LCD1602_百度百科 (baidu.com)https://baike.baidu.com/item/LCD1602/6014393?frge_ala LCD1602液晶显示屏通过电压来改变填充在两块平行板之…...

为什么我学了几天 STM32 感觉一脸茫然?
今日话题,为什么我学了几天 STM32 感觉一脸茫然?从51单片机过渡到STM32,首先需要理解“单片机”究竟是什么,编程语言虽然重要,但也需要深入理解。51单片机的控制相对简单,基本是函数调用,通过给…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...