MyISAM 数据文件详解:结构、特性与适用场景
MyISAM 是 MySQL 早期的默认存储引擎,其数据存储机制与 InnoDB 有显著差异,采用 “数据与索引分离” 的文件存储方式。了解 MyISAM 的数据文件结构,有助于理解其性能特点和适用场景。
MyISAM 的三大数据文件
MyISAM 为每个表创建三个独立的文件(文件名均以表名开头),分别存储表结构、数据和索引:
| 文件扩展名 | 作用描述 | 示例(表名为 user) |
|---|---|---|
.frm |
存储表的元数据(表结构定义),包括字段类型、约束、索引定义等。 | user.frm |
.MYD |
存储表的实际数据(MYData 的缩写),按插入顺序存储,不与索引绑定。 | user.MYD |
.MYI |
存储表的索引(MYIndex 的缩写),包括主键索引、二级索引等,独立于数据文件。 | user.MYI |
示例:创建 MyISAM 表后的文件
1 | -- 创建一个 MyISAM 引擎的表 |
执行后,数据库目录下会生成三个文件:
user.frm(表结构)user.MYD(数据)user.MYI(索引)
各文件的核心特性
.frm 文件:表结构的载体
- 通用性:
.frm文件是所有 MySQL 存储引擎通用的表结构文件(包括 InnoDB),并非 MyISAM 独有。 - 内容:包含字段名、数据类型、长度、约束(如
NOT NULL)、索引定义等元数据。 - 特点:删除表时,
.frm文件会被自动删除;若手动删除.frm文件,表将无法访问(需通过备份恢复)。
.MYD 文件:数据存储的核心
- 存储方式:按记录插入顺序存储数据,不依赖索引(与 InnoDB 的 “索引组织表” 不同)。
- 支持的字段类型:所有 MySQL 字段类型(如
INT、VARCHAR、TEXT等),大字段(如LONGTEXT)的数据直接存储在.MYD中。 - 特点:
- 数据文件大小随记录增加而增长,删除记录后空间不会自动释放(需执行
OPTIMIZE TABLE回收)。 - 不支持事务和行级锁,写入操作(
INSERT、UPDATE、DELETE)会锁定整个表。
- 数据文件大小随记录增加而增长,删除记录后空间不会自动释放(需执行
.MYI 文件:索引的独立存储
- 索引结构:采用 B+ 树索引(与 InnoDB 类似),但索引与数据分离,叶子节点存储的是数据在
.MYD文件中的物理地址(而非主键)。 - 支持的索引类型:
- 主键索引(
PRIMARY KEY):要求唯一且非空。 - 二级索引(
INDEX):可创建多个,用于加速非主键字段的查询。 - 全文索引(
FULLTEXT):MyISAM 原生支持全文索引(InnoDB 在 MySQL 5.6+ 才支持)。
- 主键索引(
- 特点:
- 索引文件独立于数据文件,创建 / 删除索引仅影响
.MYI文件,不修改.MYD。 - 索引损坏时可通过
REPAIR TABLE修复(如断电导致索引文件损坏)。
- 索引文件独立于数据文件,创建 / 删除索引仅影响
MyISAM 与 InnoDB 数据文件的核心区别
| 特性 | MyISAM 数据文件 | InnoDB 数据文件 |
|---|---|---|
| 文件组成 | .frm(结构)+ .MYD(数据)+ .MYI(索引) |
.frm(结构)+ .ibd(数据 + 索引,独立表空间) |
| 事务支持 | 不支持 | 支持(依赖 redo log 和 undo log) |
| 锁粒度 | 表级锁(写入时锁定整个表) | 行级锁(仅锁定修改的行) |
| 索引与数据关系 | 索引与数据分离,索引存储数据物理地址 | 聚簇索引与数据融合,二级索引存储主键 |
| 空间回收 | 删除数据后需 OPTIMIZE TABLE 回收 |
独立表空间支持 TRUNCATE 快速回收 |
| 崩溃恢复 | 索引损坏可修复,数据损坏难恢复 | 支持崩溃恢复(依赖 redo log) |
MyISAM 的适用场景
尽管 InnoDB 是当前主流存储引擎,MyISAM 在特定场景下仍有优势:
- 只读或读写极少的表:如静态数据报表(避免表级锁的性能影响)。
- 需要全文索引的场景:MyISAM 全文索引在旧版本 MySQL 中更成熟(新版本 InnoDB 已支持)。
- 空间有限且追求简单:MyISAM 数据文件结构简单,占用空间略小于 InnoDB。
v1.3.10