当前位置: 首页 > news >正文

MySQL体系架构解析(三):MySQL数据存储的揭秘

MySQL中的数据目录

确定MySQL的数据目录

到底MySQL把数据都存到哪个路径下呢?其实数据木对应着一个系统变量datadir,我们在使用客户端与服务器建立连接之后查看这个系统变量的值就可以了。

-- 以下两种方式都可以
show variables like 'datadir';
select @@datadir;

当然这个目录可以通过配置文件进行修改,由我们自己指定。

数据目录都放些什么?

MySOL在运行过程中都会产生哪些数据呢?当然会包含我们创建的数据库、表、视图和触发器等用户数据,除了这些用户数据,为了程序更好地运行,MySQL也会创建一些其他的额外数据。

数据库在文件系统的中表示

create database lijin charset=utf8;

在这里插入图片描述

每当我们使用create database语句从创建一个数据库时,在文件系统上实际发生了什么呢?其实很简单,每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹,我们每当新建一个数据库时,MySQL会帮我们做这两件事儿:

  1. 在数据目录下创建一个和数据库名同名的子目录(或者文件夹)
  2. 在该与数据库名同名的子目录下创建一个名为db.opt的文件,该文件中包含了该数据库的各种属性,比方说该数据的字符集和比较规则等。

在这里插入图片描述
比方说我们查看一下在我的计算机上当前有哪些数据库︰
在这里插入图片描述
可以看到在当前有5个数据库,其中 linjin 数据库是我们自定义的,其余4个数据库是属于MySQL自带的系统数据库。我们再看一下数据目录下的内容:
在这里插入图片描述
在这里插入图片描述
当然这个数据目录下的文件和子目录比较多,但是如果仔细看的话,除了information_schema这个系统数据库外,其他的数据库在数居目录下都有对应的子目录。这个information_schema比较特殊,我们后面再讲它的作用。

数据表在文件系统中的表示

我们的数据其实都是以记录的形式插入到表中的,每个表的信息其实可以分为两种。

  • 表结构的定义
  • 表中的数据

表结构就是该表的名称是啥,表里边有多少列,每个列的数据类型是啥,有啥约束条件和索引,用的啥字符集和比较规则各种信息,这些信息都体现在了我们的见表语句中了。为了保存这些信息,InnoDB 和 MyISAM 这两种哪个存储引擎都在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件,文件名是这样:tableName.frm。

比方说我们在lijin数据库下创建一个名为test的表
在这里插入图片描述
那在数据库 lijin 对应的子目录下就会创建一个名为test.frm的用于描述表结构的文件。这个后缀名为.fm是以二进制格式存储的。
在这里插入图片描述
那表中的数据存到什么文件中了呢?不同的存储引擎就有所不同,下边我们分别看了下 InnoDB 和 MyISAM 是用什么文件来保存表中数据的。

InnoDB是如何存储表数据

InnoDB 的数据会放在一个表空间或者文件空间(英文名: table space 或者 file space )的概念,这个表空间是一个抽象的概念,它可以对应文件系统上一个或多个真实文件〈不同表空间对应的文件数量可能不同)。每一个表空间可以被划分为很多很多很多个页,我们的表数据就存放在某个表空间下的某些页里。表空间有好几种类型。

系统表空间(system tablespace)
这个所谓的系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB 会在数据目录下创建一个名为 ibdata1 (在你的数据目录下找找看有木有)、大小为12M的文件,这个文件就是对应的系纳表空间在文件系统上的表示。
在这里插入图片描述
这个文件是所谓的自扩展文件,也就是当不够用的时候它会自己增加文件大小,当然,如果你想让系统表空间对应文件系统上多个实际文件,或者仅仅觉得原来的 ibdata1 这个文件名难听,那可以在 MySQL 启动时配置对应的文件路径以及它们的大小,我们也可以把系统表空间对应的文件路径不配置到数据目录下,甚至可以配置到单独的磁盘分区上。

需要注意的一点是,在一个MySQL服务器中,系统表空间只有一份。从MySQL5.5.7到MySQL5.6.6之间的各个版本中,我们表中的数据都会被默认存储到这个系统表空间。

独立表空间(file-per-table tablespace)
在 MySQL5.6.6 以及之后的版本中,InnoB 并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不过添加了一个. ibd 的扩展名而已,所以完整的文件名称长这样:tableName.ibd

比方说假如我们使用了独立表空间去存储lijin数据库下的test表的话,那么在该表所在数据库对应的lijin目录下会为test表创建这两个文件:
test.frm和test.ibd
在这里插入图片描述
其中test.ibd文件就用来存储test表中的数据和索引,.frm 格式的文件前面已经说过,这里就不再赘述了。当然我们也可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数
innodb_file_per_table 控制,比如说我们想刻意将表数据都存储到系统表空间时,可以在启动MySQL服务器的时候这样配置:

[server]
innodb_file_per_table=0

  • innodb_file_per table的值为0时,代表使用系统表空间;
  • innodb_file_per table的值为1时,代表使用独立表空间。

不过inmodb_file_per_table参数只对新建的表起作用,对于已经分配了表空间的表并不起作用。

其他类型的表空间
随着 MySQL 的发展,除了上述两种老牌表空间之外,现在还新提出了一些不同类型的表空间,比如通用表空间(general tablespace) 、undo表空间(undotablespace)、临时表空间〈temporary tablespace)等。

MyISAM是如何存储表数据的

在 MyISAM 中的数据和索引是分开存放的。所以在文件系统中也是使用不同的文件来存储数据文件和索引文件。而且和 InnoDB 不同的是,MyISA 并没有什么所谓的表空间一说,表数据都存放到对应的数据库子目录下。
在这里插入图片描述
test_myisam 表使用 MyISAM 存储引擎的话,那么在它所在数据库对应的 lijin 目录下会为 MyISAM表创建三个文件:
在这里插入图片描述
其中 test_myisam.MYD 代表表的数据文件,也就是我们插入的用户记录; test_myisam.MYI 代表表的索引文件,我们为该表创建的索引都会放到这个文件中。

相关文章:

  • Gerrit相对Git提供了一个特有的命名空间“refs/for/”用来定义我们的提交上传到哪个branch
  • C#报错 iText.Kernel.Exceptions.PdfException: ‘Unknown PdfException
  • pyinstaller打包遇到报错,和pathlib冲突
  • 实战项目中文影评情感分析系统
  • 电子电路基础2(杂乱)
  • 全球数控金属切削机床市场:现状、趋势与应对策略
  • 火语言RPA--选择元素工具使用方法
  • D3ctf-web-d3invitation单题wp
  • 从边界防护到内生安全:企业网络安全进化路线图
  • 解决Zotero翻译插件Zotero PDF Translate无法正常翻译
  • Linux命令基础(2)
  • 使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
  • 基于 openEuler 22.03 LTS SP1 构建 DPDK 22.11.8 开发环境指南
  • 一些免费的大A数据接口库
  • 华为防火墙IPSec VPN全解析:配置实战与原理详解
  • LeetCode 热题 100 74. 搜索二维矩阵
  • 惠普HP Deskjet 9600 打印机信息
  • 网页端 js 读取发票里的二维码信息(图片和PDF格式)
  • 【Veristand】Veristand环境安装教程-Linux RT / Windows
  • Flink checkpoint
  • 专业做曝光引流网站/seo3的空间构型
  • 响应式网站psd/百度浏览器官网下载
  • 自己怎么建设网站/苏州搜索引擎优化
  • 天津如何做百度的网站推广/谷歌google搜索引擎入口
  • 高端定制服装/搜索引擎技术优化
  • 怎么做企业网站仿站/东莞seo优化排名