MySQL 数据目录和 InnoDB 表空间补充知识:详细结构

news2024/11/26 23:33:01

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 HeaderFile Trailer

(1)FIL_PAGE_OFFSET表空间下描述页号,4字节,因此一个表空间最多 64TB,即 (2^32)*16KB

(2)FIL_PAGE_PREVFIL_PAGE_NEXT 上/下页的页号,主要是数据页(INDEX 类型)使用

(3)FIL_PAGE_TYPE据此区分页的类型

2.2 独立表空间结构

表空间划分为一个一个的区(每个 1 MB),每 256 个区组成一个组。
图9-3
(1)第一个组最开始的 3 个页面的类型是固定的。

  1. FSP_HDR:整个表空间中只有一个 FSP_HDR 类型的页面;登记表空间的一些整体属性和本组索引的区。
    图9-9
File Space Header共 112 字节
Space ID4表空间 ID
Not Used4未使用,可忽略
Size4拥有的页面数
FREE Limit4尚未被初始化的最小页号,该字段表示页号之后的区都未被使用,且没有加入到 FREE 链表中
Space Flags4页面大小,是否为共享/临时表空间等属性
FRAG_N_USED4FREE_FRAG 链表中已使用的页面数量
List Base Node for FREE list16FREE 链表基节点
List Base Node for FREE_FRAG list16FREE_FRAG 链表基节点
List Base Node for FULL_FRAG list16FULL_FRAG 链表基节点
Next Unused Segment ID8当前表空间中下一个未使用的 Segment ID,递增
List Base Node for SEG_INODES_FULL list16SEG_INODES_FULL 链表基节点
List Base Node for SEG_INODES_FREE list16SEG_INODES_FREE 链表基节点
  1. INODE:存储 INODE Entry 数据结构

每个段对应的 INODE Entry 结构会存储到 INODE 页中。段特别多的情况下。会有多个 INODE 页,会组成链表。

SEG_INODES_FULL :在该链表中的 INODE 页没有空闲空间
SEG_INODES_FREE :有空闲空间
图9-11
如果新建一个段时,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)

  1. FREE;空闲的区
  2. FREE_FRAG;有剩余空间页面的碎片区
  3. FULL_FRAG;没有剩余空间页面的碎片区
  4. FSEG;附属于某个段的区

前三种是独立的,直属于表空间

(1)为了方便管理区,设计每个区都对应一个 XDES Entry 的结构(40 字节)。

  1. Segment ID (8 字节);段的 ID,前提是分配给了某个段。
  2. List Node (12 字节);
    指向 前/后一个 XDES Entry 的指针 (Page Number + Offset);
  3. State(4 字节);
  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 个链表

  1. FREE 链表;所有页面都是空闲的区
  2. NOT_FULL 链表;仍有空闲页面的区
  3. FULL 链表;已经没有空闲页面的区

(4)链表基节点

每个链表对应一个 List Base Node 结构(16字节)

  1. List Length;表明链表一共有多少个节点;
  2. First Node Page;该链表的头结点在表空间中的位置;
  3. Last Node Page;该链表的尾结点在表空间中的位置;
2.2.3 段的结构

每个段定义一个 INODE Entry 结构

  1. Segment ID;对应的段的编号;
  2. NOT_FULL_N_USED;在 NOT_FULL 链表中已经使用了多少个页面;
  3. 3 个 List Base Node;分别为 FREE、NOT_FULL 、FULL 链表基节点
  4. Magic Number
  5. Fragment Array Entry;共有 32 个,每个 Fragment Array Entry 结构对应一个零散的页面,这个结构一共 4 字节,表示一个零散页面的页号。
2.2.4 Segment Header

(1)索引会对应两个段,如何知道某个索引和某个段之间的对应关系?

在数据页的 Page Header 中,属性 PAGE_BTR_SEG_LEAFPAGE_BTR_SEG_TOP在 B+ 树的根页中定义,分别记录了叶子/非叶节点段的头部信息(Segment Header,其中包含表空间ID,页面号,偏移量);

2.3 系统表空间

整个 MySQL 进程只有一个系统表空间,其表空间 ID 为 0。

图9-13

页号页面类型描述
3SYS存储 Change Buffer 的头部信息
4INDEX存储 Change Buffer 的根页面
5TRX_SYS事务相关信息
6SYS第一个回滚段信息
7SYS数据字典头部信息

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+ 树根页面的位置。

图9-14
Max Row ID:隐藏主键的 ID 号,自增并且是全局共享的,即拥有 row_id 列的不同表之间的这个值也都是不同的。
Max Table ID:自增的表 ID 值。
之后记录了这些索引根页面的页号,对应上述 4 个表中的索引。

把数据字典信息当成一个段来分配存储空间,该段只有一个碎片页,即页号为 7 的页。

(6)information_schema 系统数据表

在存储引擎启动时读取这些 SYS 开头的系统表,然后填充到以 INNODB_SYS 开头的表中。

参考书籍

《MySQL 是怎样运行的》

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

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

相关文章

AVS3:双向梯度修正BGC

双向梯度修正(Bi-directional Gradient Correction,BGC)是利用双向参考块间的差值对预测值进行修正的技术。 BGC仅用于双向预测CU,设两个方向得到的单向预测值分别为pred0和pred1,修正前的双向预测值为predBI&#xf…

看完这篇,医学小白也能轻松玩转文献查阅

对医学生而言,文献查询是写论文必不可少的一环。然而这实在是一件重要但又心累的事情。你是否每次查找文献,都感觉自己在进行无意义的重复劳动;一天下来全在搜索、下载、保存;搜索引擎给出的结果太多太杂,或者找不到全…

linux C++实现线程绑定CPU

前言 嵌入式里面我们会使用到多核的cpu,随着产品芯片性能提升,我们也会有很多功能,以及很多进程产生运行,这个时候我们在任务调度调优的时候,把一些进程绑定到固定cpu运行,下面就来分享一下cpu绑定运行的过…

ubunt18.04.4 安装petalinux2022.2

安装Petalinux需要许多依赖: 安装下面的工具: sudo apt-get install net-tools sudo apt-get install xterm sudo apt-get install autoconf sudo apt-get install libtool sudo apt-get install texinfo sudo apt-get install zlib1g-dev sudo apt-get…

Android Studio报错:connect refused

参考链接: https://blog.csdn.net/qq_43213783/article/details/113936012 参考文章中说报错主要是由于代理导致的,在文件->设置->外观与行为->系统设置->HTTP代理。 方法一: 查看打开代理(前提是代理可以通网&#x…

混沌系统在图像加密中的应用(小波混沌神经网络)

混沌系统在图像加密中的应用(小波混沌神经网络) 前言一、小波混沌神经网络模型二、拓展三、python代码 前言 小波混沌神经网络是一种神经网络模型,结合了小波变换和混沌理论,用于信号处理、分类和预测。该模型基于多层前向神经网…

经典OJ题:单链表相交

目录 题目: 链表相交🍌的概念: 单链表相交🍌主要的问题: 思路的分析🍌: 问题的回答: 如何判断相交🍌: 如何寻找交点🍌: 代码演…

独立云厂商市场份额第一 | 云轴科技ZStack位居IDC云系统软件市场报告第一梯队

近日,全球IT市场研究和咨询公司IDC发布《中国云系统软件市场跟踪报告2023H1》报告,报告显示2023年上半年中国云系统软件整体市场规模达到24.08亿元,同比增长16.4%。其中,云轴科技ZStack 作为产品化的云基础软件提供商,…

Leetcode-206 反转链表

迭代法:将指针方向依次改变,定义两个指针pre和cur /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, Lis…

如何找出最优的【SVC】核函数和参数值—以乳腺癌数据集为例

在实际的工作中,有的时候我们不知道数据特征,也不知道我们的数据是线性还是非线性。因此我们需要对数据一步步进行摸索,来找到最优的核函数和参数值。接下来我们以sklearn乳腺癌数据集为例。 先来导入相应的模块: from sklearn.d…

solidworks安装时,出现这个错误:无法获得下列许可SOLIDWORKS Standard.无效的(不一致的)使用许可号码。(-8,544,0)

问题描述:在安装SolidWorks2023时,按照软件管家中的步骤,但是在打开SolidWorks2023桌面上的快捷键时,出现了这个错误: 无法获得下列许可SOLIDWORKS Standard.无效的(不一致的)使用许可号码。(-…

一文1600字使用Postman搞定各种接口token实战(建议收藏)

现在许多项目都使用jwt来实现用户登录和数据权限,校验过用户的用户名和密码后,会向用户响应一段经过加密的token,在这段token中可能储存了数据权限等,在后期的访问中,需要携带这段token,后台解析这段token才…

‘vue’不是内部或外部命令,也不是可运行的程序或批处理文件

vue不是内部或者外部命令 今天打算重新创建一个vue项目,结果一直创建不了, 于是我就npm uninstall -g vue/cli怀疑是cli版本的问题,结果删了过后想要重新安装变一直卡在sill idealTree buildDeps 然后就直接vue不是内部或外部命令了 然后我…

【uniapp小程序下载】调用uni.uploadfile方法在调试工具里是没有问题的,但是线上版本和体验版就调用不成功,真机调试也没问题

把你的下载地址前缀添加到合法域名就解决了 在调试工具里成功了是因为勾选了下面这项 下面是我的下载并打开函数 methods: {// 下载downloadFileFn(data) {if (this.detailsObj.currentUserBuy) {uni.downloadFile({// data是路径url: https:// data,success(res) {//保存到本…

2019 ICPC 银川题解(A,H,L)

赛时没发挥好6题金尾(rank38),剩下很多能写的题,其中四个dp,傻眼ing The 2019 ICPC Asia Yinchuan Regional Contest A Girls Band Party(背包) 有点迷惑的题,当时看只要 5 5 5 张…

400 页共计 800 道软件测试面试真题汇总,2023年吐血整理

800 道软件测试面试真题,高清打印版打包带走,横扫软件测试面试高频问题,涵盖测试理论、Linux、MySQL、Web 测试、接口测试、App 测试、Python、Selenium、性能测试、LordRunner、计算机网络、数据结构与算法、逻辑思维、人力资源等模块面试题…

python对Windows如何进行关机/重启?

用CMD命令进行关机/重启步骤: 1.winR,换出输入框 2.在输入框输入命令,如关机:shutdown -s -t 20,该命令是20秒后关机。 命令说明 -s 关机 -r 重启 -t 时间,后面是数字是你要设置的秒数 -a 取消命令&…

lv11 嵌入式开发 计算机硬件基础 1

目录 1 导学 1.1回顾及导学 1.2 嵌入式系统分层 1.3 linux底层开发 2 ARM体系结构与接口技术课程导学 3 计算机基础 3.1 计算机的进制 3.2 计算机组成 3.3 总线 4 多级存储结构与地址空间 4.1 多级存储概念 4.2 地址空间 5 CPU工作原理 6 练习 1 导学 1.1回顾及导…

记CVE-2022-39227-Python-JWT漏洞

文章目录 前言影响版本漏洞分析Newstar2023 Week5总结 前言 在Asal1n师傅的随口一说之下,说newstar week5出了一道祥云杯一样的CVE,于是自己也是跑去看了一下,确实是自己不知道的一个CVE漏洞,于是就从这道题学习到了python-jwt库…

【算法 | 模拟No.3】leetcode 38. 外观数列

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…