MySQL作为常用的关系型数据库,不同存储引擎在磁盘上的物理文件存储结构存在明显差异,其中frm和ibd是InnoDB引擎下非常核心的文件类型,而MyISAM引擎则有自己独立的文件组成规则。

frm和ibd文件的具体含义
frm文件的作用
frm文件是MySQL中用来存储表结构定义的文件,不管是InnoDB还是MyISAM存储引擎,只要创建了表,就会生成对应的frm文件。这个文件记录了表的字段名称、字段类型、索引定义、字符集等所有表结构相关的信息,即使表使用的是不同的存储引擎,frm文件的格式是通用的。
ibd文件的作用
ibd文件是InnoDB存储引擎独有的数据文件,用来存储表的实际数据和索引信息。InnoDB引擎支持表空间的概念,默认情况下每个表会对应一个独立的ibd文件,这种配置叫做独立表空间,也可以通过配置让所有InnoDB表共享同一个系统表空间文件ibdata1。
InnoDB与MyISAM文件存储结构对比
MyISAM引擎的文件组成
MyISAM存储引擎的表会生成三个物理文件:
- frm文件:和InnoDB一样,存储表结构定义。
- MYD文件:全称MYData,用来存储表的实际行数据。
- MYI文件:全称MYIndex,用来存储表的索引信息,索引和数据是分开存储的。
两种引擎的核心差异
我们可以从文件组成、数据存储方式、事务支持等维度对比两者的区别:
| 对比维度 | InnoDB | MyISAM |
|---|---|---|
| 核心物理文件 | frm文件、ibd文件(独立表空间)或共享ibdata1文件 | frm文件、MYD文件、MYI文件 |
| 数据和索引存储 | 数据和索引存储在同一个ibd文件中,索引叶子节点存储主键值或行数据 | 数据和索引分开存储,MYI文件存储索引,索引叶子节点存储数据行的磁盘地址 |
| 事务支持 | 支持ACID事务,有redo日志和undo日志 | 不支持事务 |
| 锁级别 | 支持行级锁 | 仅支持表级锁 |
文件操作相关示例
我们可以通过简单的SQL操作查看文件生成效果,首先创建两个不同存储引擎的表:
-- 创建InnoDB引擎的表
CREATE TABLE test_innodb (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
) ENGINE=InnoDB;
-- 创建MyISAM引擎的表
CREATE TABLE test_myisam (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
) ENGINE=MyISAM;
执行上述语句后,在MySQL的数据目录下,会生成对应的文件:
- test_innodb.frm、test_innodb.ibd
- test_myisam.frm、test_myisam.MYD、test_myisam.MYI
如果我们想查看InnoDB的表空间配置,可以执行以下SQL:
-- 查看独立表空间是否开启,ON表示每个表对应独立ibd文件 SHOW VARIABLES LIKE 'innodb_file_per_table';
当我们需要恢复误删的表时,如果是MyISAM引擎,只要三个文件没有损坏,直接复制到对应的数据目录就可以恢复表;如果是InnoDB引擎,单独复制ibd文件无法直接恢复,需要配合frm文件和数据字典信息操作,流程会更复杂。
不同场景的存储引擎选择
如果业务需要事务支持、高并发读写、行级锁,优先选择InnoDB存储引擎,这也是MySQL5.5之后默认的存储引擎。如果业务是读多写少、不需要事务、对查询性能要求高,比如日志统计类场景,可以选择MyISAM存储引擎,不过目前MyISAM的使用场景已经越来越少。