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 对比

    

特性MyISAMInnoDB
事务支持❌ 不支持✔ 支持
锁定级别表锁行锁
外键约束❌ 不支持✔ 支持
崩溃恢复需手动修复自动恢复
全文索引(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. 在低峰期执行(大表转换可能耗时)

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)