Mysql 中的 MyISAM 引擎
🧱 什么是 MyISAM?
MyISAM 是 MySQL 早期的默认存储引擎,特点是结构简单、读取速度快,但不支持事务和行级锁。
它适合那些 读多写少、对事务安全要求不高 的场景,比如旧版博客系统、数据仓库等。
📦 MyISAM 的核心特点(对比 InnoDB)
特性 | MyISAM | InnoDB |
---|---|---|
✅ 事务支持 | ❌ 不支持事务 | ✅ 支持事务,ACID |
✅ 锁粒度 | 表级锁(锁整个表) | 行级锁 |
✅ 外键 | ❌ 不支持 | ✅ 支持 |
✅ 崩溃恢复 | ❌ 容易数据损坏 | ✅ 支持 crash-safe |
✅ 读写效率 | 高(读多写少场景) | 写性能稍弱但更稳定 |
✅ 存储格式 | 每张表对应 .frm + .MYD + .MYI | .ibd 文件或共享表空间 |
✅ 表大小 | 支持大表(默认 256TB) | 也支持大表,但管理复杂一些 |
🧩 组成结构
假设有一个表 users
,使用 MyISAM 引擎:
会有三个文件:
文件名 | 类型 | 用途 |
---|---|---|
users.frm | 表结构定义 | 存储表的字段结构等信息 |
users.MYD | MyData | 存储真正的数据 |
users.MYI | MyIndex | 存储索引信息 |
⚙️ 主要功能点
1️⃣ 表级锁
- 每次读或写都会锁整个表
- 写操作容易阻塞读操作,写并发性能差
2️⃣ 不支持事务
- 没有 rollback、commit 的概念
- 执行错误无法回滚数据
3️⃣ 支持全文索引(全文检索)
- 在早期版本中,MyISAM 比 InnoDB 更早支持
FULLTEXT
索引(MySQL 5.6 之前)
4️⃣ 插入缓存
- 有一个 key cache 缓存索引块,类似 InnoDB 的 buffer pool,但只缓存索引,不缓存数据页
5️⃣ 启动修复机制
- 崩溃后,系统需要使用
myisamchk
工具修复表 - 数据容易损坏,不适合对可靠性有要求的业务系统
💡 使用场景(现在基本用于只读数据)
- 静态博客网站(只读内容)
- 数据仓库 / 报表系统(大量 select,极少更新)
- 需要快速全文搜索(旧版本)
不过在现代系统中,几乎 100% 会推荐用 InnoDB,除非你明确知道你要干啥。
🛠️ 如何创建 MyISAM 表?
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
) ENGINE=MyISAM;
🧠 总结
MyISAM 是 MySQL 早期的默认引擎,速度快但功能弱,适合读多写少、事务要求低的场景,现在更多用于历史兼容或只读表。