MyISAM存储引擎
MyISAM是MySQL 5.5之前版本的默认存储引擎,不支持事务,采用表级锁。
存储结构
每个MyISAM表在磁盘上存储为三个文件:
| 文件扩展名 | 说明 |
|---|---|
| .frm | 表结构定义文件 |
| .MYD | 数据文件(MYData) |
| .MYI | 索引文件(MYIndex) |
SQL
表名.frm → 表结构元数据
表名.MYD → 实际数据记录
表名.MYI → 索引数据
核心特性
1. 非事务型
SQL
-- MyISAM不支持事务,每条语句自动提交
CREATE TABLE t_myisam (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=MyISAM;
-- 以下操作不会回滚
INSERT INTO t_myisam VALUES (1, 'test');
-- 即使后续失败,上面数据也已持久化
2. 表级锁
SQL
-- 读锁(共享锁)
LOCK TABLE t_myisam READ;
-- 只能读,不能写
UNLOCK TABLES;
-- 写锁(排他锁)
LOCK TABLE t_myisam WRITE;
-- 独占访问
UNLOCK TABLES;
3. 全文索引
SQL
CREATE TABLE articles (
id INT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT INDEX ft_idx(title, content)
) ENGINE=MyISAM;
-- 全文检索
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('关键词');
4. 压缩表
text
-- 对只读表进行压缩,减少存储空间
-- 使用myisampack工具
-- myisampack 表名.MYD
索引结构
MyISAM采用非聚簇索引:
text
.MYI索引文件:
索引键 → 数据文件地址(.MYD中的偏移量)
.MYD数据文件:
按插入顺序存储记录
MyISAM的主键索引和辅助索引结构相同,都是非聚簇的,索引文件中存储数据文件地址。
适用场景
| 场景 | 是否适合 |
|---|---|
| 读密集型 | ✅ 适合 |
| 写密集型 | ❌ 不适合(表锁) |
| 需要事务 | ❌ 不支持 |
| 全文检索 | ✅ 支持(5.6前) |
| 只读数据分析 | ✅ 压缩表节省空间 |
与InnoDB对比
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事务 | ❌ | ✅ |
| 锁粒度 | 表级锁 | 行级锁 |
| 外键 | ❌ | ✅ |
| 聚簇索引 | ❌ | ✅ |
| 崩溃恢复 | ❌ 差 | ✅ 强 |
| 全文索引 | ✅ 原生 | ✅ 5.6+支持 |
MySQL 5.6之后InnoDB也支持全文索引,MyISAM的使用场景进一步缩小。
要点总结
- MyISAM不支持事务,采用表级锁
- 数据和索引分离存储:.MYD数据文件 + .MYI索引文件
- 适合读多写少、不需要事务的场景
- 现代MySQL应用首选InnoDB,MyISAM主要用于历史系统维护
📝 发现内容有误?点击此处直接编辑