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单片机的控制相对简单,基本是函数调用,通过给…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...