最可靠的方式是查 SHOW TABLE STATUS 的 Engine 字段,它实时反映当前引擎,比 CREATE TABLE 语句或 information_schema.TABLES 更准确,且支持 WHERE 精确过滤、\G 竖排导出,但分区表需额外查 information_schema.PARTITIONS。

MySQL 表的存储引擎类型不能只看 CREATE TABLE 语句或建表时指定的 ENGINE,因为后续可能被修改;最可靠的方式是查 SHOW TABLE STATUS 的 Engine 字段。
SHOW TABLE STATUS 返回的 Engine 字段才是真实当前引擎
很多人误以为建表时写了 ENGINE=InnoDB 就永远是 InnoDB,但执行过 ALTER TABLE t ENGINE=MyISAM 后,只有 SHOW TABLE STATUS LIKE 't' 的 Engine 列会反映最新状态。系统表 information_schema.TABLES 虽然也存这个值,但 SHOW TABLE STATUS 更快、更直接,且包含额外关键信息(如行数估算、索引长度)。
-
SHOW TABLE STATUS是实时读取表元数据,不依赖缓存或统计延迟 - 若表不存在,会报错
Table 'db.t' doesn't exist,不是静默跳过 - 对视图执行会返回
Engine为NULL,需提前确认对象类型
如何快速查单个表的引擎(含数据库名)
必须显式指定数据库,否则默认查当前 USE 的库。跨库查表时,LIKE 不支持 db.table 格式,得先 USE db 或用 WHERE 过滤:
SHOW TABLE STATUS WHERE Name = 'users' AND Db = 'myapp';
- 用
WHERE比LIKE更精确,避免表名前缀匹配(如查user可能误中users_log) -
Name和Db字段区分大小写,取决于系统变量lower_case_table_names设置 - 结果中
Engine值为InnoDB、MyISAM、MEMORY等,注意大小写固定
批量查多个表或整个库的引擎类型
用 WHERE 配合 IN 或正则可一次查多张表;查整个库则省略条件:
SHOW TABLE STATUS WHERE Name IN ('orders', 'customers');
- 想导出所有表引擎用于审计?加
\G改为竖排格式更易读:SHOW TABLE STATUS\G - 在脚本中解析时,注意
SHOW TABLE STATUS输出字段顺序固定,第 2 列是Engine(但建议按列名取值,别依赖位置) - 如果某张表显示
Engine为空或NULL,大概率是权限不足(需SELECT权限在information_schema)或表损坏
真正容易被忽略的是:当使用分区表时,SHOW TABLE STATUS 的 Engine 显示的是主表引擎,但各分区可能使用不同引擎(MySQL 8.0+ 已不支持混用),此时必须查 information_schema.PARTITIONS 才能确认细节。


















