Skip to content

MyISAM存储索引


MyISAM 是 MySQL 中一种经典的存储引擎(在 MySQL 8.0 中已被移除),在 MySQL 5.7 及更早版本中广泛使用。
它以高读取性能结构简单著称,适用于读多写少、不要求事务支持的应用场景。
MyISAM 不支持事务、行级锁和外键约束,但其高效的 索引机制 是性能的关键。

MyISAM 的数据与索引是分开存储的,每张表由三个文件组成:

文件类型后缀名作用
表结构定义.frm存储表字段和结构信息
数据文件.MYD存储实际的数据记录
索引文件.MYI存储索引信息(主键、唯一索引、普通索引等)

这种结构意味着 MyISAM 索引是非聚簇索引(Non-Clustered Index)

2.1. 非聚簇索引(Non-Clustered Index)

Section titled “2.1. 非聚簇索引(Non-Clustered Index)”

MyISAM 使用 B+ 树 作为索引的底层结构。
与 InnoDB 不同,MyISAM 的索引和数据文件是分离的

  • 表中数据行按插入顺序保存在 .MYD 文件;

  • 索引(包括主键和其他索引)保存在 .MYI 文件;

  • 所有索引的叶子节点都存储的是 数据行在 .MYD 文件中的物理地址(偏移量)

例如:

CREATE TABLE t (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
KEY idx_age (age)
) ENGINE=MyISAM;
  • 主键索引叶子节点:(id, 行地址)

  • 普通索引 idx_age 叶子节点:(age, 行地址)

查询 SELECT * FROM t WHERE age = 25 的过程:

  1. 在索引树 idx_age 中查找 age = 25

  2. 获取其行地址;

  3. 根据地址从 .MYD 文件中读取对应行数据(即“回表”)。

MyISAM 支持三种索引类型:

索引类型说明
B-Tree 索引默认类型,底层结构为 B+ 树
FULLTEXT 全文索引用于文本搜索(MyISAM 是最早支持 FULLTEXT 的引擎)
SPATIAL 空间索引用于 GIS 空间数据(如 POINTPOLYGON
特性说明
非聚簇结构索引与数据文件分离,叶子节点存储行指针
支持前缀压缩索引可进行前缀压缩,减小索引体积(参数 myisam_sort_buffer_size 可调)
表级锁机制写入或更新时锁定整个表,不支持行级锁
崩溃恢复弱数据库异常关闭可能导致表损坏,需手动修复(REPAIR TABLE
读取性能高适合读多写少场景,如日志或统计分析表
  • 日志分析、只读缓存表

  • 报表统计系统

  • 低并发、以查询为主的历史归档数据

  • 高并发写入

  • 需要事务一致性或外键约束的业务系统

项目MyISAMInnoDB
索引类型非聚簇索引聚簇索引(主键)+ 非聚簇索引(二级索引)
数据存储.MYD 文件中,独立于索引数据存储在主键 B+ 树的叶子节点
主键索引叶子节点存储行地址(指针)存储整行数据
二级索引查找一次索引查找 + 一次数据文件查找一次二级索引查找 + 一次主键索引查找(回表)
锁机制表级锁行级锁
事务支持❌ 不支持✅ 支持(ACID)
崩溃恢复弱(需手动修复)强(redo/undo 日志)
全文索引支持(默认)5.6+ 开始支持
外键不支持支持

MyISAM 索引机制核心特征:

  • 索引与数据文件分离;

  • 索引叶子节点存储的是数据行的物理地址;

  • 所有索引均为非聚簇;

  • 结构简单、读取性能高;

  • 不支持事务与行锁,崩溃恢复较弱。