MySQL 物理文件组成(数据文件)

94 阅读3分钟

在 MySQL 中每一个数据库都会在定义好(或者默认)的数据目录下存在一个以数据库名 字命名的文件夹,用来存放该数据库中各种表数据文件。不同的 MySQL 存储引擎有各自不同 的数据文件,存放位置也有区别。多数存储引擎的数据文件都存放在和 MyISAM 数据文件位 置相同的目录下,但是每个数据文件的扩展名却各不一样。如 MyISAM 用“.MYD”作为扩展名,Innodb 用“.ibd”,Archive 用“.arc”,CSV 用“.csv”,等等。

1、“.frm”文件

与表相关的元数据(meta)信息都存放在“.frm”文件中,包括表结构的定义信息等。不论是什么存储引擎,每一个表都会有一个以表名命名的“.frm”文件。所有的“.frm”文件都存放在所属数据库的文件夹下面。

2、“.MYD”文件

“.MYD”文件是 MyISAM 存储引擎专用,存放 MyISAM 表的数据。每一个 MyISAM 表都会有一个“.MYD”文件与之对应,同样存放于所属数据库的文件夹下,和“.frm”文件在一起 。

3、“.MYI”文件

“.MYI”文件也是专属于 MyISAM 存储引擎的,主要存放 MyISAM 表的索引相关信息。对于 MyISAM 存储来说,可以被 cache 的内容主要就是来源于“.MYI”文件中。每一个 MyISAM 表对应一个“.MYI”文件,存放于位置和“.frm”以及“.MYD”一样。

4、“.ibd”文件和 ibdata 文件

这两种文件都是存放 Innodb 数据的文件,之所以有两种文件来存放 Innodb 的数据(包 括索引),是因为 Innodb 的数据存储方式能够通过配置来决定是使用共享表空间存放存储数 据,还是独享表空间存放存储数据。独享表空间存储方式使用“.ibd”文件来存放数据,且 每个表一个“.ibd”文件,文件存放在和 MyISAM 数据相同的位置。如果选用共享存储表空 间来存放数据,则会使用 ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配 置)ibdata 文件。ibdata 文件可以通过 innodb_data_home_dir 和 innodb_data_file_path 两 个 参 数 共 同 配 置 组 成 , innodb_data_home_dir 配 置 数 据 存 放 的 总 目 录 , innodb_data_file_path 配 置 每 一 个 文 件 的 名 称 。

当 然 , 也 可 以 不 配 置 innodb_data_home_dir 而接innodb_data_file_path 参数配置的时候使用绝对路径来 完成配置。innodb_data_file_path 中可以一次配置多个 ibdata 文件。文件可以是指定大小,也可以是自动扩展的,但是 Innodb 限制了仅仅只有最后一个 ibdata 文件能够配置成自 动扩展类型。

当我们需要添加新的 ibdata 文件的时候,只能添加在 innodb_data_file_path 配置的最后,而且必须重启 MySQL 才能完成 ibdata 的添加工作。不过如果我们使用独享表 空间存储方式的话,就不会有这样的问题,但是如果要使用裸设备的话,每个表一个裸设备 , 可能造成裸设备数量非常大,而且不太容易控制大小,实现比较困难,而共享表空间却不会 有这个问题,容易控制裸设备数量。我个人还是更倾向于使用独享表空间存储方式。当然, 两种方式各有利弊,看大家各自应用环境的侧重点在那里了。

上面仅仅介绍了两种最常用存储引擎的数据文件,此外其他各种存储引擎都有各自的数据文件。