MaSks要加油丫
发布于 2025-04-18 / 28 阅读
0
0

Mysql文件系统

今天写写mysql文件系统,像 InnoDB、 MyISAM 这样的存储引擎都是把表存储在磁盘上的,操作系统用来管理磁盘的结构被称为 文件系统 ,所以用专业一点的话来表述就是:像 InnoDB、 MyISAM 这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。

本文学习一下InnoDB 和 MyISAM 这两个存储引擎的数据如何在文件系统中存储。

这两存储引擎它们在数据存储文件系统上的差异在不同版本(5.0 和 8.0)中有所演变,主要体现在文件组成、存储结构和管理方式上。以下从两个版本阶段分别分析:

首先从InnoDB 5.0版本开始说起,这个存储引擎是5.5之后默认的

注意,mysql的数据存放目录位于Linux磁盘上/var/lib/mysql中,通过 show variables like 'datadir'查看数据文件位置

图上为5.7版本InnoDB引擎,进入具体数据库文件系统,其中 .opt 文件存放的是针对dbtest库下的一些基础信息,比如字符集之类, .frm 是存储表结构的,实际数据5.7版本默认是存放在 .ibd , 需要注意的是,实际数据不仅可以放在 .ibd 文件中,也可以放在 存储文件根目录下 ibdata1 中(独立于具体数据库,系统表空间,默认情况下,InnoDB会在数据目录下创建一个名为 ibdata1、大小为 12M的文件,这个文件就是对应的 系统表空间 在文件系统上的表示),5.5-5.6版本中所有的表数据都是存放于 ibdata1 中

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

我们可以自己指定使用 系统表空间 还是 独立表空间 来存储数据,这个功能由启动参数innodb_file_per_table控制,比如说我们想刻意将表数据都存储到系统表空间 时,可以在启动MySQL服务器的时候这样配置:

8.0版本后的InnoDB中,

可以注意到,不存在 .opt 文件和 .frm ,表结构和表数据合二为一到 ibd 中了。可以从以下mysql提供的内置方法证明,

可以通过生成的txt文件查看到对应的表数据信息。

MyISAM引擎中如图

在InnoDB中,索引即数据,数据即索引,都是放在 .ibd 。MyiSAM中,数据和索引是分开存储的。

以下总结引用自尚硅谷老师教程图片。


评论