MySQL 8.0+ 默认存储引擎由 default_storage_engine 变量控制,执行 SHOW VARIABLES LIKE 'default_storage_engine' 可查;某表实际引擎应以 SHOW TABLE STATUS 结果中的 Engine 字段为准,而非建表语句或 information_schema 缓存值。

查看 MySQL 默认存储引擎用哪个变量
MySQL 8.0+ 的默认存储引擎由 default_storage_engine 系统变量控制,不是过时的 storage_engine —— 后者在 5.7 后已弃用,查出来可能为空或报错。直接执行:
SHOW VARIABLES LIKE 'default_storage_engine';如果返回
Value 是 InnoDB,说明新建表不显式指定引擎时就用它;如果是 MyISAM,那得小心——事务、外键、行锁全没。
查某张表实际用了什么引擎,别只信建表语句
SHOW CREATE TABLE 看的是建表时写的 DDL,但引擎可能被后续 ALTER TABLE ... ENGINE= 改过,也可能因版本升级/复制同步出错而“悄悄降级”。更可靠的现场快照是:
SHOW TABLE STATUS LIKE 'user_order';注意输出中的
Engine 字段——这才是当前真实生效的引擎。常见坑:
- 复制从库上某张表显示
ENGINE=InnoDB,但Rows为NULL,可能是表损坏或未加载元数据 - 用
information_schema.TABLES查询时,TABLE_SCHEMA必须严格匹配数据库名(区分大小写取决于系统配置)
批量查一个库所有表的引擎类型,用 INFORMATION_SCHEMA 最稳
想一眼看清 shop_db 下哪些表还在用 MyISAM(比如为兼容老备份脚本),直接查系统库最可靠:
SELECT TABLE_NAME, ENGINE, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'shop_db' ORDER BY ENGINE;
-
TABLE_ROWS是估算值,InnoDB下不准,MyISAM下才接近真实 - 如果查询卡住或超时,可能是
information_schema表被大表元数据阻塞,可加/*+ MAX_EXECUTION_TIME(5000) */限流(MySQL 5.7.8+) - 别用
SHOW TABLE STATUS FROM shop_db替代——它在库大、表多时性能差,且不支持 WHERE 过滤
status 变量里没有“存储引擎统计”,别被名字误导
SHOW STATUS 查的是运行时状态计数器(如 Com_select、Innodb_rows_inserted),**不包含引擎分布统计**。有人搜 “mysql engine status” 误以为有类似 Innodb_engine_status 的指标,其实没有。真要监控引擎使用情况,得靠:
- 定期采样
information_schema.TABLES并存档对比 - 用
performance_schema.table_io_waits_summary_by_table看各引擎表的 I/O 压力(需开启相关 consumers) - 慢日志里
Rows_examined高但ENGINE是MyISAM?赶紧查是否缺索引或锁表了
information_schema 的缓存可能延迟刷新,刚 ALTER 完立刻查,偶尔会看到旧值。










