mysql 5.7 默认存储引擎为innodb,但需执行select @@default_storage_engine;确认是否生效;若返回myisam或null,则可能因配置弃用(default-storage-engine已无效)、写错段落(非[mysqld]段)、动态覆盖(set global)或加载错误配置文件所致;永久设置须在my.cnf的[mysqld]段中写default_storage_engine = innodb并重启mysqld。

MySQL 5.7 的默认存储引擎已经是 InnoDB,但实际是否生效,得看你的配置有没有被覆盖、有没有被动态改过——不能只信版本文档。
怎么确认当前生效的默认引擎
别查文档,直接连上 MySQL 执行:
SELECT @@default_storage_engine;
如果返回 NULL 或 MyISAM,说明没生效。常见原因有:
-
my.cnf里写的是default-storage-engine = InnoDB(短横线),但 5.7+ 已弃用,启动时会警告并忽略 - 配置写在了
[client]段而不是[mysqld]段,完全不加载 - 运行过
SET GLOBAL default_storage_engine = 'MyISAM';,动态覆盖了配置值 - 实际加载的配置文件不是你改的那个(比如你改了
/etc/my.cnf,但它优先读/etc/mysql/my.cnf)
修改 my.cnf 的正确写法
必须满足这三点,否则重启也白改:
- 参数名只能是
default_storage_engine(下划线,不是短横线) - 必须放在
[mysqld]段内,不能加引号:default_storage_engine = InnoDB,不是default_storage_engine = "InnoDB" - 改完后必须重启
mysqld进程,FLUSH PRIVILEGES或SERVICE mysql reload都无效
Linux 常见路径:/etc/my.cnf、/etc/mysql/my.cnf、/www/server/mysql/my.cnf(宝塔);不确定时跑:mysqld --verbose --help | grep "Default options" 查加载顺序。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
为什么 CREATE TABLE 还是 MyISAM
即使 @@default_storage_engine 返回 InnoDB,建表仍可能是 MyISAM,因为:
- SQL 里显式写了
ENGINE=MyISAM,比如老脚本或mysqldump导出的建表语句 - 用户权限不足,MySQL 在无法创建
InnoDB表时可能 fallback 到MyISAM(尤其在严格模式关闭时) -
innodb_file_per_table关闭且系统表空间满,InnoDB 初始化失败,部分旧版本会静默退化
所以最稳的做法:所有 CREATE TABLE 都显式写 ENGINE=InnoDB,别依赖默认值。
已有 MyISAM 表怎么安全转 InnoDB
ALTER TABLE t ENGINE=InnoDB 会重建整张表,大表风险高:
- 必须先备份:
mysqldump -u root -p db_name table_name > backup.sql - 检查是否有
FULLTEXT索引——MySQL 5.6+ 的InnoDB才支持,否则报错ERROR 1214 (HY000) - 大表(>100MB)加
ALGORITHM=COPY, LOCK=NONE(5.6+ 支持在线 DDL):ALTER TABLE log_table ENGINE=InnoDB, ALGORITHM=COPY, LOCK=NONE; - 转换后执行
ANALYZE TABLE table_name;更新统计信息,避免查询计划不准
真正容易被忽略的是:配置改对了、重启成功了、变量也对了,但应用代码里还藏着一堆 ENGINE=MyISAM ——这才是线上事故最常见的源头。










