mysql的数据到底是怎么存的(上)|mysql系列(4)

qezhu521
发布于 2022-4-20 15:15
浏览
0收藏

作者 | 小汪哥写代码
来源 | 小汪哥(ID:xwgcoding)

前言

一个优秀的数据库,必然涉及到持久化,有持久化,就有数据落盘的操作。有落盘操作就必然有文件存储的位置规划。而且了解数据库的持久化文件也是了解数据库高可用,可扩展的前提。像Hbase,redis,rocksdb,tidb等数据库都有相通的地方,这个后面有时间分享。

InnoDB是一个将表中的数据存储到磁盘上的存储引擎 。这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写入数据的时候,这些存储引擎会把这些数据又写回文件系统。

也是mysql 持久化的保证 ,那InnoDB 引擎是怎么组织数据的呢?这就要了解innodb 文件存储结构。

数据存储的位置

数据是存储在数据目录中的,数据目录是用来存储MySQL在运行过程中产生的数据,和mysql 的数据安装目录是两个概念。我们可以通过下面的语句来查看。

SHOW VARIABLES LIKE 'datadir';

mysql的数据到底是怎么存的(上)|mysql系列(4)-鸿蒙开发者社区

数据库表和文件系统的对应关系

其实每个数据库都对应数据目录下的一个子目录,或者说对应一个文件夹。

当我们创建数据库时,mysql会帮我们做两件事:

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

比如看看我现在的机器上有哪些数据库:mysql的数据到底是怎么存的(上)|mysql系列(4)-鸿蒙开发者社区

以及对应文件系统对应的位置:mysql的数据到底是怎么存的(上)|mysql系列(4)-鸿蒙开发者社区

磁盘视角

从磁盘的视角来看,物理存储主要为系统表空间、独立表空间、通用表空间、undo表空间、redo log;mysql的数据到底是怎么存的(上)|mysql系列(4)-鸿蒙开发者社区

系统表空间(system tablespace)

系统表空间可以对应文件系统上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1(在你的数据目录下找找看有木有)、大小为12M的文件,这个文件就是对应的系统表空间在文件系统上的表示。这个文件是自扩展文件。在一个MySQL服务器中,系统表空间只有一份。

独立表空间(file-per-table tablespace)

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

表名.ibd

假如我们使用了独立表空间去存储demo数据库下的test表的话,那么在该表所在数据库对应的demo目录下会为test表创建这两个文件:

test.frm
test.ibd

其中test.ibd文件就用来存储test表中的数据和索引.然我们也可以自己指定使用系统表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table控制。

其他类型的表空间

随着mysql的发展,陆续出现了通用表空间(general tablespace)、undo表空间(undo tablespace)、临时表空间(temporary tablespace)。

mysql的架构图

了解mysql的架构图,有助于理解innodb 引擎的几种物理文件的组成。mysql的数据到底是怎么存的(上)|mysql系列(4)-鸿蒙开发者社区

以上,是我对mysql 物理存储的理解。

收藏
回复
举报
回复
    相关推荐