mysql 5.7默认引擎是innodb,因自5.5起已硬编码强制设定,5.7中default-storage-engine配置项被弃用,即使修改也仅当前会话生效;系统表、数据字典及权限操作均依赖innodb事务与原子性,myisam无法支撑。

MySQL 5.7 默认引擎是 InnoDB,不是因为配置设了,而是硬编码强制的
从 MySQL 5.5 开始,InnoDB 就已是默认引擎;到 5.7,default-storage-engine 配置项已被官方弃用——写进 my.cnf 也不会生效,启动时只报警告,不报错,也不覆盖。你查 SELECT @@default_storage_engine; 永远返回 InnoDB,哪怕你改过变量(5.7 中 SET GLOBAL default_storage_engine = 'MyISAM' 能执行但仅限当前进程,重启即丢)。
为什么不能用 MyISAM 替代默认引擎
这不是“没配对”,而是架构层面封死了:
- MySQL 5.7 的系统表(如
mysql.user、mysql.db)已全部迁移到 InnoDB,依赖其事务和行锁保障权限变更原子性 -
CREATE USER、GRANT等语句底层操作都走 InnoDB 表,换引擎会导致语法直接失败 - 数据字典(Data Dictionary)在 5.7 已开始向 InnoDB 迁移,8.0 彻底完成;MyISAM 不支持原子 DDL,无法支撑元数据一致性
- 即使强行启用
skip_innodb=OFF并开启 MyISAM,也会导致INFORMATION_SCHEMA查询异常或缺失部分视图
建表时不写 ENGINE=,到底用哪个引擎
答案很干脆:InnoDB。无论你有没有显式指定,只要没写 ENGINE= 子句,5.7 就按 InnoDB 创建表。验证方式很简单:
CREATE TABLE t1 (id INT);<br>SHOW CREATE TABLE t1;
输出里一定带 ENGINE=InnoDB。如果你想用 MyISAM,必须显式写死:CREATE TABLE t2 (id INT) ENGINE=MyISAM;
临时表引擎也受版本控制,别以为它能绕开规则
临时表的引擎选择逻辑和普通表不同,但它同样被版本绑定:
- 5.7 及以前:内存超限时自动降级到
MyISAM(因当时 MyISAM 是唯一启用的轻量磁盘引擎) - 5.7.30+ 和 8.0:默认降级目标改为
InnoDB,且MyISAM需手动启用(skip_myisam=OFF),否则CREATE TEMPORARY TABLE ... ENGINE=MyISAM直接报错Unknown storage engine 'MyISAM' - 真正影响性能的是是否落地磁盘,而不是落地后用哪个引擎——优先调大
tmp_table_size和max_heap_table_size(取小值生效)
InnoDB 成为默认,不是历史惯性,而是事务、崩溃恢复、外键、MVCC 这些能力已深度嵌入 MySQL 核心流程。试图绕过它,等于在引擎层撕开一个兼容性缺口。











