MyISAM 是 MySQL 早期版本的默认存储引擎(5.5 之前),以其简单高效的设计著称,特别适合读密集型应用。
一、核心特性
1. 非事务型引擎
不支持 ACID 事务
不支持回滚操作
2. 表级锁定
整个表加锁(读共享锁,写排他锁)
并发写入性能较差
3. 高速读取
纯读取性能通常优于 InnoDB
适合数据仓库、报表等读多写少场景
4. 全文索引支持
内置全文检索功能(FULLTEXT 索引)
MySQL 5.6 后 InnoDB 也支持,但早期版本是 MyISAM 独有
二、物理存储结构
1. 文件组成
`.frm` 文件:表结构定义
`.MYD` 文件:数据文件(MYData)
`.MYI` 文件:索引文件(MYIndex)
2. 存储格式
静态表(固定长度列):访问速度快,占用空间多
动态表(可变长度列):空间利用率高,易产生碎片
压缩表:只读表,通过 myisampack 工具创建
3. 索引特性
使用 B-tree 索引结构
支持前缀索引(列值前N个字符建立索引)
最大键长度 1000 字节
三、关键机制
1. 锁定机制
共享读锁:`LOCK TABLE table_name READ`
独占写锁:`LOCK TABLE table_name WRITE`
支持并发插入:`concurrent_insert` 系统变量控制
2. 自动修复
支持通过 `REPAIR TABLE` 命令修复损坏的表
崩溃恢复能力弱于 InnoDB
3. 延迟键写入
`DELAY_KEY_WRITE` 选项可延迟索引更新
提升批量插入性能,但增加崩溃后索引损坏风险
四、性能特点
1. 优势场景
适合的场景示例
SELECT COUNT(*) FROM large_read_only_table; -- 全表计数快
SELECT * FROM log_table WHERE date > '2023-01-01'; -- 范围查询快
2. 劣势场景
不适合的场景示例
BEGIN;
UPDATE account SET balance = balance - 100 WHERE user_id = 5; -- 无事务支持
UPDATE account SET balance = balance + 100 WHERE user_id = 10;
COMMIT; -- 无法保证原子性
3. 与 InnoDB 对比
特性 | MyISAM | InnoDB |
---|---|---|
事务支持 | ❌ 不支持 | ✔ 支持 |
锁定级别 | 表锁 | 行锁 |
外键约束 | ❌ 不支持 | ✔ 支持 |
崩溃恢复 | 需手动修复 | 自动恢复 |
全文索引(5.6前) | ✔ 支持 | ❌ 不支持 |
存储占用 | 较小 | 较大 |
COUNT(*) 性能 | 极快(存储计数) | 需全表扫描 |
五、使用建议
1. 适用场景
日志系统(只追加,很少更新)
数据仓库/报表系统(读为主)
不需要事务的简单查询应用
需要全文索引的旧版MySQL(<5.6)
2. 配置优化
key_buffer_size = 内存的25-30% # MyISAM索引缓存
myisam_sort_buffer_size = 64M # 修复/排序时使用
myisam_max_sort_file_size = 10G # 排序临时文件限制
3. 维护命令
ANALYZE TABLE table_name; -- 更新索引统计信息
REPAIR TABLE table_name; -- 修复损坏的表
OPTIMIZE TABLE table_name; -- 整理碎片
六、局限性
1. 崩溃不安全:电源故障等可能导致表损坏
2. 扩展性差:表锁限制写入并发
3. 功能缺失:
不支持外键
不支持行级锁
不支持MVCC
4. 逐渐淘汰:
MySQL 8.0 已将系统表全部迁移到 InnoDB
官方不再积极开发新功能
七、迁移建议
对于现有 MyISAM 表,如需事务支持或更高并发,可转换为 InnoDB:
ALTER TABLE table_name ENGINE=InnoDB;
转换前需注意:
1. 确保应用不依赖 MyISAM 特性(如并发插入)
2. 准备足够的磁盘空间(InnoDB 占用更多空间)
3. 在低峰期执行(大表转换可能耗时)
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程