0%

MyISAM的数据文件

MyISAM 数据文件详解:结构、特性与适用场景

MyISAM 是 MySQL 早期的默认存储引擎,其数据存储机制与 InnoDB 有显著差异,采用 “数据与索引分离” 的文件存储方式。了解 MyISAM 的数据文件结构,有助于理解其性能特点和适用场景。

MyISAM 的三大数据文件

MyISAM 为每个表创建三个独立的文件(文件名均以表名开头),分别存储表结构、数据和索引:

文件扩展名 作用描述 示例(表名为 user
.frm 存储表的元数据(表结构定义),包括字段类型、约束、索引定义等。 user.frm
.MYD 存储表的实际数据(MYData 的缩写),按插入顺序存储,不与索引绑定。 user.MYD
.MYI 存储表的索引(MYIndex 的缩写),包括主键索引、二级索引等,独立于数据文件。 user.MYI

示例:创建 MyISAM 表后的文件

1
2
3
4
5
6
-- 创建一个 MyISAM 引擎的表
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT
) ENGINE=MyISAM;

执行后,数据库目录下会生成三个文件:

  • user.frm(表结构)
  • user.MYD(数据)
  • user.MYI(索引)

各文件的核心特性

.frm 文件:表结构的载体

  • 通用性.frm 文件是所有 MySQL 存储引擎通用的表结构文件(包括 InnoDB),并非 MyISAM 独有。
  • 内容:包含字段名、数据类型、长度、约束(如 NOT NULL)、索引定义等元数据。
  • 特点:删除表时,.frm 文件会被自动删除;若手动删除 .frm 文件,表将无法访问(需通过备份恢复)。

.MYD 文件:数据存储的核心

  • 存储方式:按记录插入顺序存储数据,不依赖索引(与 InnoDB 的 “索引组织表” 不同)。
  • 支持的字段类型:所有 MySQL 字段类型(如 INTVARCHARTEXT 等),大字段(如 LONGTEXT)的数据直接存储在 .MYD 中。
  • 特点:
    • 数据文件大小随记录增加而增长,删除记录后空间不会自动释放(需执行 OPTIMIZE TABLE 回收)。
    • 不支持事务和行级锁,写入操作(INSERTUPDATEDELETE)会锁定整个表。

.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 在特定场景下仍有优势:

  1. 只读或读写极少的表:如静态数据报表(避免表级锁的性能影响)。
  2. 需要全文索引的场景:MyISAM 全文索引在旧版本 MySQL 中更成熟(新版本 InnoDB 已支持)。
  3. 空间有限且追求简单:MyISAM 数据文件结构简单,占用空间略小于 InnoDB。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10