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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 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
相关文章
|
2月前
|
关系型数据库 MySQL 数据库
【Mac os系统】安装MySQL数据库
本文详细介绍了在Mac OS系统上安装MySQL数据库的步骤,包括下载、安装、配置环境变量、启动服务、授权设置以及解决常见问题,并提供了一些常用的MySQL命令。
93 0
【Mac os系统】安装MySQL数据库
|
2天前
|
关系型数据库 Unix MySQL
MySQL是一种关系型数据库管理系统
MySQL是一种关系型数据库管理系统
11 2
|
5天前
|
数据采集 中间件 关系型数据库
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
17 2
|
2月前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
42 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
2月前
|
数据可视化 关系型数据库 MySQL
Mysql8 如何在 Window11系统下完成跳过密钥校验、完成数据库密码的修改?
这篇文章介绍了如何在Windows 11系统下跳过MySQL 8的密钥校验,并通过命令行修改root用户的密码。
Mysql8 如何在 Window11系统下完成跳过密钥校验、完成数据库密码的修改?
|
2月前
|
关系型数据库 MySQL Linux
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
|
2月前
|
关系型数据库 MySQL 数据库连接
成功解决「MySQL问题1」启动mysql时:发生系统错误5拒绝访问
这篇文章介绍了如何解决启动MySQL服务时遇到的系统错误5(拒绝访问),通过管理员权限启动命令窗口并使用"net start mysql"和"net stop mysql"命令来控制服务。
|
2月前
|
SQL 数据可视化 关系型数据库
MySQL 备份可视化巡检系统
MySQL 备份可视化巡检系统
|
2月前
|
关系型数据库 MySQL Linux
一文教会你如何在Linux系统中使用Docker安装Mysql 5.7版本 【详细过程+图解】
这篇文章提供了在Linux系统中使用Docker安装Mysql 5.7版本的详细过程和图解,包括安装指定版本、创建实例、启动、使用Navicat连接测试、文件挂载与端口映射、进入容器、配置文件修改以及重新启动容器等步骤。
一文教会你如何在Linux系统中使用Docker安装Mysql 5.7版本 【详细过程+图解】
|
2月前
|
数据采集 数据可视化 关系型数据库
【优秀python web设计】基于Python flask的猫眼电影可视化系统,可视化用echart,前端Layui,数据库用MySQL,包括爬虫
本文介绍了一个基于Python Flask框架、MySQL数据库和Layui前端框架的猫眼电影数据采集分析与可视化系统,该系统通过爬虫技术采集电影数据,利用数据分析库进行处理,并使用Echart进行数据的可视化展示,以提供全面、准确的电影市场分析结果。
下一篇
无影云桌面