MyISAM存储索引
MyISAM 是 MySQL 中一种经典的存储引擎(在 MySQL 8.0 中已被移除),在 MySQL 5.7 及更早版本中广泛使用。
它以高读取性能和结构简单著称,适用于读多写少、不要求事务支持的应用场景。
MyISAM 不支持事务、行级锁和外键约束,但其高效的 索引机制 是性能的关键。
1. MyISAM 存储结构概览
Section titled “1. MyISAM 存储结构概览”MyISAM 的数据与索引是分开存储的,每张表由三个文件组成:
| 文件类型 | 后缀名 | 作用 |
|---|---|---|
| 表结构定义 | .frm | 存储表字段和结构信息 |
| 数据文件 | .MYD | 存储实际的数据记录 |
| 索引文件 | .MYI | 存储索引信息(主键、唯一索引、普通索引等) |
这种结构意味着 MyISAM 索引是非聚簇索引(Non-Clustered Index)。
2. 索引存储结构
Section titled “2. 索引存储结构”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 的过程:
-
在索引树
idx_age中查找age = 25; -
获取其行地址;
-
根据地址从
.MYD文件中读取对应行数据(即“回表”)。
2.2. 索引类型
Section titled “2.2. 索引类型”MyISAM 支持三种索引类型:
| 索引类型 | 说明 |
|---|---|
| B-Tree 索引 | 默认类型,底层结构为 B+ 树 |
| FULLTEXT 全文索引 | 用于文本搜索(MyISAM 是最早支持 FULLTEXT 的引擎) |
| SPATIAL 空间索引 | 用于 GIS 空间数据(如 POINT、POLYGON) |
3. 索引特性与限制
Section titled “3. 索引特性与限制”| 特性 | 说明 |
|---|---|
| 非聚簇结构 | 索引与数据文件分离,叶子节点存储行指针 |
| 支持前缀压缩 | 索引可进行前缀压缩,减小索引体积(参数 myisam_sort_buffer_size 可调) |
| 表级锁机制 | 写入或更新时锁定整个表,不支持行级锁 |
| 崩溃恢复弱 | 数据库异常关闭可能导致表损坏,需手动修复(REPAIR TABLE) |
| 读取性能高 | 适合读多写少场景,如日志或统计分析表 |
3.1. 适用场景
Section titled “3.1. 适用场景”-
日志分析、只读缓存表
-
报表统计系统
-
低并发、以查询为主的历史归档数据
3.2. 不适用场景
Section titled “3.2. 不适用场景”-
高并发写入
-
需要事务一致性或外键约束的业务系统
4. MyISAM 与 InnoDB 索引机制对比
Section titled “4. MyISAM 与 InnoDB 索引机制对比”| 项目 | MyISAM | InnoDB |
|---|---|---|
| 索引类型 | 非聚簇索引 | 聚簇索引(主键)+ 非聚簇索引(二级索引) |
| 数据存储 | .MYD 文件中,独立于索引 | 数据存储在主键 B+ 树的叶子节点 |
| 主键索引叶子节点 | 存储行地址(指针) | 存储整行数据 |
| 二级索引查找 | 一次索引查找 + 一次数据文件查找 | 一次二级索引查找 + 一次主键索引查找(回表) |
| 锁机制 | 表级锁 | 行级锁 |
| 事务支持 | ❌ 不支持 | ✅ 支持(ACID) |
| 崩溃恢复 | 弱(需手动修复) | 强(redo/undo 日志) |
| 全文索引 | 支持(默认) | 5.6+ 开始支持 |
| 外键 | 不支持 | 支持 |
MyISAM 索引机制核心特征:
-
索引与数据文件分离;
-
索引叶子节点存储的是数据行的物理地址;
-
所有索引均为非聚簇;
-
结构简单、读取性能高;
-
不支持事务与行锁,崩溃恢复较弱。