mysql中InnoDB的表空间--系统表空间

大家好。上篇文章我们讲了InnoDB的独立表空间,我们知道了表空间被划分为许多连续的区,对于大小为16KB的页面来说,每个区默认由64个页组成,每256个区为一组,每个组最开始的几个页的类型是固定的。(在这里强烈建议在看本篇文章之前先看一下上一篇文章)今天我们再来聊一聊–系统表空间。

系统表空间的结构和独立表空间基本类似,只不过由于整个MySQL进程只有一个系统表空间,在系统表空间中会额外记录一些有关整个系统信息的页面,所以会比独立表空间多出一些记录这些信息的页面。具体结构如下图所示:
图片
我们可以看出系统表空间和独立表空间的前三个页面(页号分别为0、1、2,类型分别是FSP_HDR、IBUF_BITMAP、INODE)的类型是完全一样的,只是页号为3~7的页面是系统表空间特有的,这些多出来的页面功能如下所示:

页号页面类型英文描述描述
3SYSInsert Buffer Header存储Insert Buffer的头部信息
4INDEXInsert Buffer Root存储Insert Buffer的根页面
5TRX_SYSTransction System事务系统的相关信息
6SYSFirst Rollback Segment第一个回滚段的页面
7SYSData Dictionary Header数据字典头部信息

除了这几个记录系统属性的页面之外,系统表空间的extent1和extent 2这两个区被称为 Doublewrite buffer ,也就是双写缓冲区。

今天我们先聊一下InnoDB数据字典,其余的概念之后咱们聊。

InnoDB数据字典

每当我们向一个表中插入一条记录的时候,mysqld都要校验插入语句对应的表存不存在,插入的列和表中的列是否符合,如果语法没有问题的话,还需要知道该表的聚簇索引和所有二级索引对应的根页面是哪个表空间的哪个页面,然后把记录插入对应索引的B+树中。所以说,MySQL 除了保存着我们插入的用户数据之外,还需要保存许多额外的信息,比如:

某个表属于哪个表空间,表里边有多少列;

表对应的每一个列的类型是什么;

该表有多少索引,每个索引对应哪几个字段;

该索引对应的根页面在哪个表空间的哪个页面;

该表有哪些外键,外键对应哪个表的哪些列;

某个表空间对应文件系统上文件路径是什么。

这些数据并不是插入的用户数据而是为了更好的管理用户数据而不得 已引入的一些额外数据,这些数据也称为元数据。InnoDB存储引擎特意定义了一系列的内部系统表(internal system table)来记录这些这些元数据,内部系统表有以下几种:

表名描述
SYS_TABLES整个InnoDB存储引擎中所有的表的信息
SYS_COLUMNS整个InnoDB存储引擎中所有的列的信息
SYS_INDEXES整个InnoDB存储引擎中所有的索引的信息
SYS_FIELDS整个InnoDB存储引擎中所有的索引对应的列的信息
SYS_FOREIGN整个InnoDB存储引擎中所有的外键的信息
SYS_FOREIGN_COLS整个InnoDB存储引擎中所有的外键对应列的信息
SYS_TABLESPACES整个InnoDB存储引擎中所有的表空间信息
SYS_DATAFILES整个InnoDB存储引擎中所有的表空间对应文件系统的文件路径信息
SYS_VIRTUAL整个InnoDB存储引擎中所有的虚拟生成列的信息

这些系统表也就是所谓的数据字典,它们都是以B+树的形式保存在系统表空间的某些页面中,其中 SYS_TABLES 、SYS_COLUMNS 、 SYS_INDEXES、SYS_FIELDS 这四个表最为重要,称之为基本系统表(basic system tables),我们先看看这4个表的结构:

SYS_TABLES表

列名描述
NAME表的名称
IDInnoDB存储引擎中每个表都有一个唯一的ID
N_COLS该表拥有列的个数
TYPE表的类型,记录了一些文件格式、行格式、压缩等信息
MIX_ID已过时,忽略
MIX_LEN表的一些额外的属性
CLUSTER_ID未使用,忽略
SPACE该表所属表空间的ID

这个SYS_TABLES表有两个索引:以NAME列为主键的聚簇索引以ID列建立的二级索引

SYS_COLUMNS表

列名描述
TABLE_ID该列所属表对应的ID
POS该列在表中是第几列
NAME该列的名称
MTYPE主数据类型
PRTYPEprecise type,精确数据类型
LEN该列最多占用存储空间的字节数
PREC该列的精度,不过这列貌似都没有使用,默认值都是0

SYS_COLUMNS表只有一个聚集索引:以(TABLE_ID, POS)列为主键的聚簇索引

SYS_INDEXES表

列名描述
TABLE_ID该索引所属表对应的ID
IDInnoDB存储引擎中每个索引都有一个唯一的ID
NAME该索引的名称
N_FIELDS该索引包含列的个数
TYPE该索引的类型,比如聚簇索引、唯一索引、普通的二级索引等
SPACE该索引根页面所在的表空间ID
PAGE_NO该索引根页面所在的页面号
MERGE_THRESHOLD如果页面中的记录被删除到某个比例,就把该页面和相邻页面合并,这个值就是这个比例

SYS_INEXES 表只有一个聚集索引:以(TABLE_ID, ID) 列为主键的聚簇索引

SYS_INDEXES表

列名描述
INDEX_ID该索引列所属的索引的ID
POS该索引列在某个索引中是第几列
COL_NAME该索引列的名称

这个SYS_INEXES 表只有一个聚集索引:以(INDEX_ID, POS) 列为主键的聚簇索引

Data Dictionary Header 页面

只要有了上述4个基本系统表,我们就可以获取其他系统表以及用户定义的表的所有元数据。

比方说我们想看看SYS_TABLESPACES 这个系统表里存储了哪些表空间以及表空间对应的属性,我们可以执行下面操作:

到SYS_TABLES 表中根据表名定位到具体的记录,就可以获取到 SYS_TABLESPACES 表的TABLE_ID。

使用这个TABLE_ID到SYS_COLUMNS表中就可以获取到属于该表的所有列的信息。

使用这个TABLE_ID还可以到SYS_INDEXES表中获取所有的索引的信息,索引的信息中包括对应的INDEX_ID,还记录着该索引对应的B+树根页面是哪个表空间的哪个页面。

使用INDEX_ID 就可以到SYS_FIELDS表中获取所有索引列的信息。

那么这4个表的元数据去哪里获取呢?原来这4个表的元数据信息硬编码到了代码中,然后InnoDB用一个固定的页面来记录这4个表的聚簇索引和二级索引对应的B+树位置,这个页面就是页号为7的页面,类型为SYS,记录了Data Dictionary Header ,也就是数据字典的头部信息。除了这4个表的5个索引的根页面信息外,这个页号为7的页面还记录了整个InnoDB存储引擎的一些全局属性,如下图所示:

在这里插入图片描述

这个页面由下边几个部分组成:

名称占用空间简单描述
File Header(文件头部)38 字节页的一些通用信息
Data Dictionary Header(数据字典头部信息)52 字节记录一些基本系统表的根页面位置以及InnoDB存储引擎的一些全局信息
Unused4 字节
Segment Header(段头部信息)10 字节记录本页面所在段对应的INODE Entry位置信息
Empty Space(尚未使用空间)16272字节用于页结构的填充,没啥实际意义
File Trailer(文件尾部)8 字节校验页是否完整

可以看到这个页面里有Segment Header 部分,意味着InnoDB把这些有关数据字典的信息当成一个段来分配存储空间。由于需要记录的数据字典信息非常少(可以看到Data Dictionary Header 部分仅占用了56字节),所以该段只有一个碎片页,也就是页号为7的这个页。

接下来我们聊一聊Data Dictionary Header部分的各个字段:

Max Row ID : 如果我们建表时没有定义主键,而且表中也没有 UNIQUE 索引,那么InnoDB存储引擎会默认生成一个名为row_id 的列作为主键。因为它是主键,所以每条记录的row_id列的值不能重复。在拥有 row_id列的表插入一条记录时,该记录的row_id列的值就是Max Row ID 对应的值,然后再把 Max Row ID 对应的值加1,也就是说这个Max Row ID 是全局共享的。

Max Table ID : InnoDB存储引擎中的所有的表都对应一个唯一的ID,每次新建一个表时,就会把本字段的值+1,然后作为该表的ID。

Max Index ID : InnoDB存储引擎中的所有的索引都对应一个唯一的ID,每次新建一个索引时,就会把本字段的值+1,作为该索引的ID。

Max Space ID : InnoDB存储引擎中的所有的表空间都对应一个唯一的ID,每次新建一个表空间时,就会把本字段的值+1,作为该表空间的ID。

Mix ID Low(Unused) : 这个字段没啥用,跳过。

Root of SYS_TABLES clust index : 表示SYS_TABLES表聚簇索引的根页面的页号。

Root of SYS_TABLE_IDS sec index : 表示SYS_TABLES表为ID列建立的二级索引的根页面的页号。

Root of SYS_COLUMNS clust index : 表示SYS_COLUMNS表聚簇索引的根页面的页号。

Root of SYS_INDEXES clust index: 表示SYS_INDEXES表聚簇索引的根页面的页号。

Root of SYS_FIELDS clust index : 表示SYS_FIELDS表聚簇索引的根页面的页号。

information_schema 系统数据库

用户是不能直接访问InnoDB 的这些内部系统表的,但是InnoDB在系统数据库 information_schema 中提供了一些以 innodb_sys 开头的表。
在这里插入图片描述

在information_schema 数据库中的这些以 INNODB_SYS 开头的表并不是真正的内部系统表(内部系统表就是上边说的以SYS 开头的那些表),而是在存储引擎启动时读取这些以SYS开头的系统表,然后填充到这些以 INNODB_SYS 开头的表中。

好了,今天的内容到这里就结束了,有什么疑问欢迎在评论区进行讨论。最后依旧是请各位老板有钱的捧个人场,没钱的也捧个人场,谢谢各位老板!

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

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

相关文章

HCIP-Datacom-ARST自选题库__BGP判断【20道题】

1.传统的BGP-4只能管理IPV4单播路由信息,MP-BGP为了提供对多种网络层协议的支持,对BGP-4进行了扩展。其中MP-BGP对IPv6单播网络的支持特性称为BGP4,BGP4通过Next Hop属性携带路由下一跳地址信息。 2.BGP4通过Update报文中的Next Hop属性携带…

RK3568笔记二十六:音频应用

若该文为原创文章,转载请注明原文出处。 一、介绍 音频是我们最常用到的功能,音频也是 linux 和安卓的重点应用场合。 测试使用的是ATK-DLR3568板子,板载外挂RK809 CODEC芯片,RK官方驱动是写好的,不用在自己重新写。…

智慧城市运维可视化:透视未来城市高效管理的新视窗

行业痛点 现代城市运维是一个复杂而庞大的系统,涉及到诸多方面,包括交通、环境、能源等等。然而,在城市运维中,存在着一些现实的痛点,给城市管理者带来了不小的压力和困扰: 1、交通拥堵 随着城市化进程的…

帝国cms自定义专题列表模板list.var中获取对应专题下的信息、信息数量及信息所属栏目名称

帝国cms自定义专题列表模板list.var中获取对应专题下的信息、信息数量及信息所属栏目名称 代码如下: $rr $empire->fetch1("SELECT GROUP_CONCAT(id) from phome_enewsztinfo where ztid$r[id]"); $ff $rr[0]; $ga explode(",", $ff); …

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑分布式光伏高效消纳与负荷损失最小的区域配电网应急资源协同配置策略》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

一款网站源码下载开源工具 Website Downloader

一、简介 Website Downloader 是一款免费的网站源码下载器,下载任何网站的完整源代码,包括 JavaScript、样式表、图像等等,而且使用也非常简单,只需要粘贴网址,用户即可将网页链接内容下载到本地,而且自动…

堆(建堆算法,堆排序)

目录 一.什么是堆? 1.堆 2.堆的储存 二.堆结构的创建 1.头文件的声明: 2.向上调整 3.向下调整 4.源码: 三.建堆算法 1.向上建堆法 2.向下建堆法 四.堆排序 五.在文件中Top出最小的K个数 一.什么是堆? 1.堆 堆就…

Docker之xfs文件系统下安装报错解决方案

一、需求说明 centos系统下安装docker最新版的时候,安装成功,启动的时候报错。报错信息“failed to start daemon: error initializing graphdriver: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorr…

ROS添加GDB调试

文章目录 一、问题描述二、配置步骤1. debug 模式编译2. rosrun 添加GDB指令3. launch 添加GDB指令 三、GDB基本命令1. 基本2. 显示被调试文件信息3. 查看/修改内存4. 断点5. 调试运行 一、问题描述 在享受ROS带来便利的同时,但因每运行出现错误,ROS不会…

风电机组的振动控制

文章目录 0. 背景1. 原文记录 0. 背景 混塔机组的频率大概是目前业内遇见的比较普遍的通病。最近在了解风电机组振动控制的知识,看到一篇科普性质的文章,感觉不错,所以记录下来。想要看原文的点击这里。感谢原作者。 1. 原文记录

一文带你了解.NET能做什么?

前言 在DotNetGuide技术社区微信交流群经常看到有小伙伴问:.NET除了能写桌面应用和Web应用还能做什么?今天大姚将通过本篇文章来简单讲讲.NET能做哪些开发,对.NET感兴趣的小伙伴也可以自行领取文末附带的.NET相关学习资料。 .NET简单介绍 .…

多层派生时的构造函数和派生类的析构函数

一、多层派生时的构造函数 目录 一、多层派生时的构造函数 二、派生类的析构函数 析构函数的作用&#xff1a; 例&#xff1a;多级派生情况下派生类的构造函数 #include <iostream> #include<string> using namespace std; class Student { public:Student(int…

【SpeedAI科研小助手】2分钟解决知网维普AIGC检测

2分钟搞定AIGC率&#xff1f;还能降到0%&#xff1f; 使用方法&#xff1a; 打开SpeedAI科研小助手&#xff0c;将功能模式换成降AIGC率&#xff0c;后面可以一段一段自己改&#xff0c;也可以直接上传论文文件&#xff0c;SpeedAI直接帮你全文修改&#xff08;主打一个用户友…

HTML5 基本框架

HTML5基本的内容 文章目录 系列文章目录前言一、HTML5 基本框架二、具体框架结构三、知识补充总结 前言 HTML5的介绍&#xff1a; HTML5 是一种用于构建网页内容的标准化语言。它是 HTML&#xff08;超文本标记语言&#xff09;的第五个版本&#xff0c;引入了许多新的功能和特…

Jmeter-使用手册(_5.5版本)

JMeter是一个Java桌面应用程序&#xff0c;具有使用Swing图形API的图形界面。可以进行接口、性能等测试&#xff0c;也可以对任何数据库进行同样的测试&#xff0c;具有可移植性&#xff0c;可跨平台支持Windows&#xff0c;Linux&#xff0c;Mac上使用。 JMeter运行场景不仅可…

模仿高效网络进行目标检测——知识蒸馏

摘要 链接&#xff1a;https://openaccess.thecvf.com/content_cvpr_2017/papers/Li_Mimicking_Very_Efficient_CVPR_2017_paper.pdf 当前的基于卷积神经网络&#xff08;CNN&#xff09;的目标检测器需要从预训练的ImageNet分类模型中初始化&#xff0c;这通常非常耗时。在本…

Java整合ELK实现日志收集 之 Elasticsearch、Logstash、Kibana

简介 Logstash&#xff1a;用于收集并处理日志&#xff0c;将日志信息存储到Elasticsearch里面 Elasticsearch&#xff1a;用于存储收集到的日志信息 Kibana&#xff1a;通过Web端的可视化界面来查看日志&#xff08;数据可视化&#xff09; Logstash 是免费且开放的服务器端数…

AI办公自动化:用kimi批量将word文档部分文件名保存到Excel中

文件夹中有很多个word文档&#xff0c;现在只要英文部分的文件名&#xff0c;保存到一个Excel文件中。 可以在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;…

数据集002:眼疾识别数据集 (含数据集下载链接)

说明 病理性近视&#xff08;Pathologic Myopia&#xff0c;PM&#xff09;的医疗类数据集&#xff0c;包含1200个受试者的眼底视网膜图片&#xff0c;训练、验证和测试数据集各400张。 说明&#xff1a; 如今近视已经成为困扰人们健康的一项全球性负担&#xff0c;在近视人…

斯坦福2024人工智能指数报告 1

《人工智能指数报告》由斯坦福大学、AI指数指导委员会及业内众多大佬Raymond Perrault、Erik Brynjolfsson 、James Manyika、Jack Clark等人员和组织合著&#xff0c;旨在追踪、整理、提炼并可视化与人工智能&#xff08;AI&#xff09;相关各类数据&#xff0c;该报告已被大多…