myisam 在 mysql 8.0 中已不可用,不是“不推荐”,而是根本不能用;执行 create table t (id int) engine=myisam 会直接报错 error 1286,因官方已从启动路径剥离其初始化逻辑,show engines 不再显示该引擎。

MyISAM 在 MySQL 8.0 中已不可用,不是“不推荐”,而是根本不能用。执行 CREATE TABLE t (id INT) ENGINE=MyISAM 会直接报错 ERROR 1286 (42000): Unknown storage engine 'MyISAM'——它在 MySQL 8.4 中已被彻底移除,8.0 起就默认禁用且不加载该插件。
MySQL 8.0 启动时 MyISAM 引擎未加载
即使你手动在配置文件里加了 plugin-load-add = myisam,MySQL 8.0+ 也不会加载。原因很直接:官方已将 MyISAM 的初始化逻辑从 server 启动路径中剥离。启动日志里搜不到 MyISAM 字样,SHOW ENGINES 输出中也看不到 MyISAM 行。这不是配置漏了,是代码层删干净了。
为什么日志类表尤其不能迁回 MyISAM
有人想把日志表(比如 sys_log、op_audit)切到 MyISAM 图快、省锁,但实际踩坑更重:
- 崩溃后数据损坏概率高:
.MYD文件写入无事务保护,断电或 kill -9 后,myisamchk -r修复成功率低,且无法保证修复后记录顺序和完整性; - 并发写入卡死:
INSERT会触发表级锁,日志高频写入场景下,多个线程排队等锁,吞吐骤降; - 没有 MVCC,
SELECT COUNT(*)这类统计查询会阻塞后续写入,而 InnoDB 可以非阻塞读; - 日志表常需关联业务主表(InnoDB),跨引擎 JOIN 无法使用外键约束,也容易因隔离级别不一致导致幻读或统计偏差。
替代 MyISAM 日志表的实操方案
如果你真在用 MyISAM 日志表并准备升级到 MySQL 8.0+,必须切换,但别只改 ENGINE=InnoDB 就完事:
- 确认表结构不含
FULLTEXT索引(MyISAM 支持,InnoDB 8.0+ 虽支持但分词行为不同,需验证); - 检查
AUTO_INCREMENT列是否被用作唯一标识——InnoDB 的自增锁机制与 MyISAM 不同,高并发插入可能观察到 ID 不连续; - 日志表若无主键,InnoDB 会隐式创建聚簇索引,建议显式加
id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,避免额外开销; - 批量写入日志时,用
INSERT INTO ... VALUES (),(),()而非单条插入,InnoDB 的 group commit 机制才能起效。
真正麻烦的不是语法替换,而是老系统里那些假设 “MyISAM 写得快、不用管事务” 的业务逻辑——它们往往绕过了唯一性校验、没处理重复插入、依赖表锁做简易同步。这些隐含假设,在 InnoDB 下会暴露为死锁、重复记录或性能毛刺,必须逐条验证。











