最准确的方法是直接查 engine 字段,执行 show table status like 'users' 或 select engine from information_schema.tables where table_schema='db' and table_name='tbl',默认引擎变量不可靠且 mysql 8.0.23+ 已弃用。

直接查 ENGINE 字段,别信默认值或版本宣传——这是唯一靠谱的方式。
用 SHOW TABLE STATUS 快速单表确认
这条命令返回结果里有明确的 Engine 列,值就是当前实际引擎:
SHOW TABLE STATUS LIKE 'users';
注意点:
- Linux 下表名区分大小写,
'users'写成'Users'可能查不到 - 如果库名不是默认库,得先
USE db_name;,或者改用SHOW TABLE STATUS FROM db_name LIKE 'table_name'; - 结果里看
Engine值是InnoDB还是MyISAM,其他字段(比如Comment)不能代替判断
用 information_schema.TABLES 批量查或写脚本
适合运维巡检、迁移前清点,也方便嵌入自动化流程:
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'orders';
常见组合条件:
- 查整个库所有表:
WHERE TABLE_SCHEMA = 'mydb' - 筛出所有
MyISAM表(迁移重点对象):AND ENGINE = 'MyISAM' - 排除系统库:
TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
别漏掉 TABLE_SCHEMA 条件——不加的话可能扫到其他库的同名表,结果错乱。
为什么 SHOW VARIABLES LIKE 'default_storage_engine' 不顶用
它只告诉你“新表默认用啥”,对已有表完全无效:
- MySQL 5.5+ 默认是
InnoDB,但老库建的表可能是MyISAM,变量值还是InnoDB - DBA 可能改过全局配置,但旧表不会自动切换引擎
- MySQL 8.0.23+ 已把
default_storage_engine标为deprecated,未来会删,现在就别依赖它 - 建表时显式写了
ENGINE=MyISAM,哪怕默认是InnoDB,这张表也是MyISAM
SHOW CREATE TABLE 能看但容易看漏
输出末尾有 ENGINE=InnoDB 这种字样,但问题在于:
- 结果可能很长,尤其带大量注释或分区定义时,
ENGINE=容易被滚屏刷过去 - 复制粘贴时如果截断了最后一行,就看不到引擎声明
- 有些工具(如某些 GUI 客户端)默认折叠建表语句,得手动展开才看得见
- 不如前两种方式直给、无歧义
真要用它,建议加 \G 格式化输出:SHOW CREATE TABLE users\G,让 ENGINE 单独成行。
真正麻烦的不是查——是查完发现一堆 MyISAM 表还混在事务逻辑里。这时候光改引擎不够,得同步检查 COUNT(*)、全文索引、外键、锁行为是否受影响。引擎一换,SQL 得重验,不是改个 ALTER TABLE ... ENGINE=InnoDB 就万事大吉。











