系统表空间-mysql详解(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 系统表空间-mysql详解(四)

上篇文章说了,索引的b+树,聚簇索引 和 二级索引,以及如何使用索引,索引对空间和时间的影响,所以索引并不是越多越好。

索引-mysql详解(三)


数据目录


前面我们说了mysql的安装目录,这里的数据目录可以用show variables like datadir

数据目录存放的是什么呢,包含我们创建的数据库,表,视图和触发器等,还为了方便查找生成一些其他的额外数据。

当我们创建数据库的时候,这时候在系统目录会显示什么呢,会在目录下生成一个与数据库同名的文件,这个目录下会有一个db.opt,包含了数据库的各种属性,比方说字符集和字符集比较规则。

那么创建表的时候呢?

表名.frm:存储的是表结构文件,二进制存储的,myISAMinnodb都会有这个文件。

那么innodb除了表结构文件外,如何存储表数据呢?

mysql5.6.6之前是默认存在系统表空间(system tablespace),他是自扩展文件,随着数据越多会越大。

mysql5.6.6之后是默认存在独立表空表(file-per-table tablespace),每个表都有独立的表空间,意味着有两个文件,表名.frm和表名.ibdFrm文件就是前面说的存储表结构,ibd文件就是存储索引加真实数据的。

当然这两个都可以根据参数来指定使用系统表空间还是独立表空间。随着mysql的发展还有很多其他表空间,比如undo表空间等就不一一赘述。

我们前面说过innodb索引和数据是一个b+树上,但是mySIAM不同,他所有的查询都是回表,因为目录索引叶和数据单独分开的,所以myISAM是有三个文件Test.frmtest.myd代表数据文件、test.myi代表索引文件。

我们知道mysql视图其实是虚拟的表,所以他是没有真实数据的,所以他只需要存储个表结构视图名.frm文件即可。

还有一些其他文件,mysql服务进程文件,日志文件,redo日志,undo日志等一些文件。

另外mysql系统数据库有哪些呢?

Mysql:核心数据库,存着用户账户权限等。

information_schema:维护所有其他数据库的信息,数据库,表,视图,触发器等,但不是真实数据,也可以称呼为描述的元数据。

Performance_schema:服务器运行过程的状态信息,可以说是性能监测。

Sys:通过视图的形式把information_schemaPerformance_schema结合,方便程序员分析。


我们前面说了数据页(index页),页都包含file headerfile trailer,前者记录一些通用信息,后者效验内存到磁盘的数据是否完整。


表空间里每个页都有自己的页号,页可以组成链表,所以不一定按照物理顺序存储,而是根据file header的头部信息上一页下一页来查找。


独立表空间结构

有区的概念(extent),因为页太多,每64个页就属于一个区,而每256个区属于一个组,第一组会记录着整个表空间一些数据,只有一个FSP_HDR类型页面。


为啥我们要有区呢,因为我们前面说了数据虽然会在b+树上,但是存储在磁盘上并不是顺序存储,两个数据之间间隔距离非常远,所以为了拉近数据过远的情况,每次数据都是在一个区内,因为查找叶子节点和非叶子节点都是范围查找,这时候如果都在一起查找明显效率会变低,所以又区把他们区分开。


区的上面就是段(segment),于是有了叶子节点段和非叶子节点段。一个聚簇索引有一个叶子节点和非叶子节点,所以有两个段。

因为每个区有2m,总不能数据每次都放在不同的区,那么就会多出很多多余的空间,这时候于是就有了碎片区(fragment)的概念。

前面三个是独立的,直属表空间管理,最后一个就属于段管理。

Free(空闲区):还没有在区用到任何页。

Free_FRAG(有剩余空间的碎片区):表示碎片区中还有可用空间。

Full_frag(没有剩余空间碎片区):都被使用。

Fseg(附属段):属于叶子段或者非叶子段。或者其他一些段。

这个结构就叫做xdes entryextent descriptor entry)。

这个xdes entry结构里面有唯一的段id,当然为了方便查找每个区,于是肯定有上一页下一页的链表,把他们组合起来。

于是他们有了free链表,free_frag链表,full_frag链表,fseg链表。

当数据占满了32个零散的页后,就开始申请完整的区来插入数据,那么它属于哪个段呢,之前有唯一段id,可以找到。段那边又有三个链表,free链表,not_Full链表,full链表。


系统表空间结构

因为整个mysql系统只有一个系统表空间,所以会多一些结构来存储整个表空间,并且他的space_id0


当我们插入一条数据的时候,会效验这个数据库有没有这个表,会判断这个列是否存在等,这时候会有一些元数据以b+树的形式记录这些表。


system_table:表的一些名称。Sys_columnssys_indexes表,sys_fields:只有聚簇索引。

但是这些表我们不能真实的访问,我们可以在前面说过的information_schema数据库里找到对应的查看表来查询这些数据,比如innodb_sys_tables就对应前面说的system_table

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
131 0
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
16天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
62 3
|
29天前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
25 2
|
29天前
|
Ubuntu 关系型数据库 MySQL
Linux系统MySQL安装
【10月更文挑战第19天】本文介绍了在 Linux 系统上安装 MySQL 的步骤,包括安装前准备、安装 MySQL、启动 MySQL 服务、配置 MySQL 以及验证安装。适用于 Ubuntu/Debian 和 CentOS/Fedora 系统,提供了详细的命令示例。
142 1
|
1月前
|
SQL JSON 关系型数据库
MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
【10月更文挑战第3天】MySQL是一个广泛使用的开源关系型数据库管理系统,它有许多不同的版本
129 5
|
1月前
|
关系型数据库 MySQL Linux
Linux系统绿色安装MySQL 8.0.39
Linux系统绿色安装MySQL 8.0.39
|
1月前
|
关系型数据库 Unix MySQL
MySQL是一种关系型数据库管理系统
MySQL是一种关系型数据库管理系统
42 2
|
2月前
|
数据采集 中间件 关系型数据库
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
|
29天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
45 0