SHOW ENGINES 能列出所有已加载引擎,直接运行即可获取当前实例实际启用的存储引擎清单,其中 Support 为 DEFAULT 的即默认引擎,Transactions 列标识事务支持能力,Engine 字段显示引擎名称。

SHOW ENGINES 能列出所有已加载引擎
直接运行 SHOW ENGINES; 就能拿到 MySQL 实例当前支持的所有存储引擎及其状态。这不是“理论支持列表”,而是实际加载进内存、可被使用的引擎清单。
结果里关键字段有三个:Engine(引擎名)、Support(是否可用)、Transactions(是否支持事务)。其中 Support 值为 DEFAULT 的那一行,就是当前默认引擎;YES 表示启用,NO 或 DISABLED 表示未启用或被禁用。
- MySQL 8.0+ 默认启用 InnoDB、CSV、MEMORY、ARCHIVE、BLACKHOLE 等,MyISAM 仍存在但不推荐新表使用
- 某些引擎(如 FEDERATED)可能默认关闭,需在配置文件中显式启用后才会出现在
SHOW ENGINES结果中 -
Transactions列对判断事务能力很实用:InnoDB 是YES,MyISAM 是NO
为什么不能只看 default_storage_engine 变量?
SHOW VARIABLES LIKE 'default_storage_engine'; 只告诉你“新建表不指定 ENGINE 时用哪个”,但它完全不反映已有表的实际引擎——一张表可能建时是 InnoDB,后来被 ALTER TABLE t ENGINE=MyISAM; 改过。
更隐蔽的问题是:这个变量值本身可能被会话级覆盖。比如执行过 SET SESSION default_storage_engine = 'MEMORY'; 后,当前连接新建的表就会用 MEMORY,但全局变量不变,SHOW VARIABLES 仍显示 InnoDB。
- 查默认值适合部署前确认策略,不适合排查线上表行为
- 若发现某张表事务不生效,别急着改配置,先用
SHOW TABLE STATUS LIKE 't'看它的Engine字段是不是真为 InnoDB - 变量名注意版本差异:
storage_engine在旧版有效,5.5+ 应该用default_storage_engine
SHOW TABLE STATUS 的 Engine 字段才是真实状态
一张表当前到底用什么引擎,唯一权威答案来自 SHOW TABLE STATUS 的 Engine 列。它实时读取表元数据,不依赖缓存,也不受建表语句残留影响。
常见误操作是只查 SHOW CREATE TABLE t; —— 它返回的是建表时写的 ENGINE,如果后续改过引擎,这里就失效了。而 SHOW TABLE STATUS LIKE 't' 的 Engine 永远是当前值。
- 跨库查询必须用
WHERE Name = 't' AND Db = 'db_name',LIKE不支持db.t格式 - 分区表要注意:
SHOW TABLE STATUS显示的是主表引擎,但各分区可能不同(MySQL 8.0+ 已禁止混用,但存量表仍需查information_schema.PARTITIONS) - 视图没有引擎,执行
SHOW TABLE STATUS会返回Engine为NULL,得先确认对象类型
批量查引擎时别只靠 information_schema.TABLES
SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'db' 确实能批量查,但它依赖统计信息刷新,有时会滞后(尤其大表 ANALYZE TABLE 未执行时),TABLE_ROWS 等字段可能不准,但 ENGINE 本身是准的。
真正快又稳的方式是 SHOW TABLE STATUS WHERE Db = 'db_name',它比查系统表更快,还顺带给出 Rows、Data_length、Index_length 等运维关键字段。
- 脚本解析时,别按字段位置取值(比如“第2列是Engine”),始终用列名引用,避免未来 MySQL 版本调整输出顺序导致出错
- 权限不足时,
SHOW TABLE STATUS可能报错或返回空,而information_schema查询可能静默跳过无权限表——这会导致漏查 - 导出审计用:加
\G(如SHOW TABLE STATUS\G)让结果竖排,比横表更容易人工核对
SHOW TABLE STATUS 就万事大吉,但分区引擎要单独确认,而没 SELECT 权限时连 Engine 都看不到。


















