MySQL 5.5+ 中 default-storage-engine 已弃用,仅 default_storage_engine 在 5.5–5.6 部分版本临时有效,5.7+ 完全忽略;新建表默认引擎始终为 InnoDB,须显式指定 ENGINE=MyISAM。

MySQL 5.5 之后 default-storage-engine 已被弃用
直接在 my.cnf 里写 default-storage-engine = MyISAM 在 MySQL 5.5+(尤其是 5.6、5.7、8.0)中不会生效,启动时会被忽略,甚至可能报警告:[Warning] 'default-storage-engine' is deprecated and will be removed in a future release.
这是因为 MySQL 从 5.5 开始默认使用 InnoDB,并逐步移除了该配置项的控制能力。真正起作用的是 default_storage_engine(下划线命名),且仅在 5.5–5.6 的部分版本中仍可临时使用;5.7+ 完全不可设。
- MySQL 5.5–5.6:可用
default_storage_engine = MyISAM,但不推荐 - MySQL 5.7+:该配置被彻底忽略,
CREATE TABLE不带ENGINE=时始终用InnoDB - 即使设了,
SHOW VARIABLES LIKE 'default_storage_engine';返回的仍是InnoDB
想让新表默认用 MyISAM?只能显式指定 ENGINE
没有全局开关能“真正”把默认引擎切回 MyISAM。唯一可靠方式是建表时明确写:
CREATE TABLE t1 (id INT) ENGINE = MyISAM;
如果大量脚本依赖隐式默认,可考虑:
- 用
mysqldump --no-create-info导出数据,再手工补全ENGINE=MyISAM到建表语句 - 在应用层统一封装建表逻辑,强制追加
ENGINE=MyISAM - 用触发器或代理层拦截 DDL(不现实,MySQL 不支持 DDL 触发器)
注意:ALTER TABLE t1 ENGINE = MyISAM; 可以转换已有表,但不能改变后续新建表的行为。
为什么硬要改默认引擎风险很大
MyISAM 缺少事务、行锁、外键、崩溃恢复等关键能力,现代业务几乎无法承受:
- 并发写入时整表锁,高并发下极易卡死
-
INSERT或UPDATE中断可能导致表损坏,需手动REPAIR TABLE - 主从复制中若从库 crash,MyISAM 表可能不同步且难以修复
- MySQL 8.0 已移除
MyISAM全文索引的某些特性,兼容性进一步下降
除非你维护的是只读归档表、极低流量的配置表,或必须兼容老系统(如某些 PHP+MySQL 4.x 遗留程序),否则不建议主动降级引擎。
检查当前实际生效的默认引擎
别信配置文件,以运行时为准:
SELECT @@default_storage_engine;
或者
SHOW VARIABLES LIKE 'default_storage_engine';
返回值才是真实默认值。如果看到 InnoDB,说明你的 my.cnf 中相关配置没起作用——这不是配置写错了,而是 MySQL 故意不认。
真正需要 MyISAM 的场景极少,多数时候是误以为它“更轻量”或“更快”,其实单表读性能差异在 SSD 和合理索引下微乎其微,而可靠性代价远高于收益。











