MySQL 5.7+ 默认存储引擎为 InnoDB,安装过程不提供引擎选择;建表应显式指定 ENGINE=InnoDB,避免因环境配置差异导致事务失效、外键报错等问题。

MySQL 5.7+ 默认用 InnoDB,别手动切 MyISAM
MySQL 5.7 开始,默认存储引擎就是 InnoDB,且安装时图形化界面(如 MySQL Installer)根本不会让你选引擎——它直接跳过这步。命令行安装(mysqld --initialize)也一样,不提供交互式引擎选择。所谓“安装过程中选择”,实际是误解:引擎不是安装时定死的,而是在建表或配置文件里控制的。
常见错误现象:CREATE TABLE t1 (...) ENGINE=MyISAM; 被照搬进新项目,结果事务失效、外键报错、高并发下锁表严重。
-
InnoDB支持事务、行级锁、外键、崩溃恢复,99% 的业务场景该用它 -
MyISAM只适合极少数只读、全文索引(5.7+ 已被InnoDB全面支持)、或历史遗留统计表 -
MEMORY表仅存于内存,重启即丢,别当持久化方案用
my.cnf 里改 default_storage_engine 要谨慎
想全局默认引擎?可以配 default_storage_engine = InnoDB,但注意位置和生效范围:
- 必须放在
[mysqld]段下,放错段(比如[client])完全不生效 - 修改后需重启
mysqld进程,SET GLOBAL不支持动态改这个变量 - 已有表不受影响——它只对后续
CREATE TABLE无显式ENGINE=的语句起作用 - 某些云数据库(如阿里云 RDS、AWS RDS)禁用该参数,改了也不生效
示例正确配置片段:
[mysqld] default_storage_engine = InnoDB innodb_file_per_table = ON
建表时不写 ENGINE= 等于依赖默认值,风险在哪
写 CREATE TABLE user (id INT); 看似省事,实则埋雷:
- 开发环境是
InnoDB,测试环境因配置不同用了MyISAM,结果事务代码在测试就出问题 - Docker 镜像版本混用(如 mysql:5.6 vs mysql:8.0),默认引擎虽都是
InnoDB,但innodb_strict_mode行为差异会导致建表失败 - DBA 统一管控时,靠脚本扫描
SHOW CREATE TABLE输出判断引擎,没显式声明的表容易漏检
建议所有 CREATE TABLE 都显式带上:ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
查看当前表用什么引擎:别只信 SHOW CREATE TABLE
SHOW CREATE TABLE t1; 最直观,但容易忽略两点:
- 如果表是分区表,
ENGINE=显示的是分区引擎,但每个子分区可能不同(需查INFORMATION_SCHEMA.PARTITIONS) - 从库上执行该命令,看到的是主库当时的建表语句,不代表当前从库实际引擎(极端情况下主从配置不一致)
- 更稳的方式是查系统表:
SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db_name' AND TABLE_NAME='t1';
注意:ENGINE 字段返回的是字符串,大小写敏感,innodb 和 InnoDB 都可能出现,比较时建议用 UPPER() 统一处理。
真正麻烦的不是选哪个引擎,而是同一套 SQL 在不同环境因默认值或隐式行为产生差异——显式声明、统一配置、定期校验,比纠结安装时点哪一项重要得多。










