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

查表用的是 InnoDB 还是 MyISAM
直接看 ENGINE 字段就行,这是最准的。别信配置文件里默认引擎设成啥,单表可以覆盖全局设置。
执行这条语句:
SHOW TABLE STATUS LIKE 'your_table_name';结果里找
Engine 列,值是 InnoDB 或 MyISAM 就是当前实际使用的引擎。
- 如果查不到表,确认库名和表名大小写——Linux 下 MySQL 表名区分大小写,
information_schema里的TABLE_SCHEMA和TABLE_NAME要对得上 - 用
SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'tbl_name';更适合写脚本批量查 -
SHOW CREATE TABLE your_table_name;也能看到,但得从建表语句末尾找ENGINE=InnoDB这种字样,容易漏看
为什么 SHOW VARIABLES LIKE 'default_storage_engine' 不靠谱
它只告诉你新创建表默认用啥引擎,不影响已有表。很多线上库是老版本迁移过来的,表引擎五花八门,光看这个变量等于白看。
- MySQL 5.5+ 默认是
InnoDB,但升级后旧表不会自动改引擎 - 有些 DBA 会把全局设成
MyISAM图快,结果开发建表时没显式指定,就中招了 -
default_storage_engine在 MySQL 8.0.23+ 已被标记为 deprecated,未来可能删掉
MyISAM 和 InnoDB 关键行为差异直接影响查询逻辑
引擎不同,SELECT COUNT(*)、全文索引、锁粒度这些基础操作表现天差地别,不确认引擎就写 SQL 很容易翻车。
-
COUNT(*):MyISAM 直接读元数据,秒出;InnoDB 得扫行(除非加了 WHERE 条件能走索引) - 全文索引:MyISAM 支持自然语言模式,InnoDB 从 5.6 开始才支持,且分词器行为不完全一致
- 崩溃恢复:InnoDB 有 redo log,断电后能恢复;MyISAM 表损坏是常态,
REPAIR TABLE是家常便饭 - 事务与外键:InnoDB 支持,MyISAM 完全不认——如果代码里写了
START TRANSACTION却没检查引擎,等于裸奔
批量查库下所有表引擎并筛出 MyISAM 表
运维或迁移前必须跑一遍,避免遗漏“隐藏”的 MyISAM 表。
执行:
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys') AND ENGINE = 'MyISAM';
- 排除系统库是防止干扰,特别是
mysql库里有些表(如plugin)在旧版本是 MyISAM,不能动 - 如果结果为空,不代表全是 InnoDB——也可能是其他引擎(如
MEMORY、ARCHIVE),需要去掉AND ENGINE = 'MyISAM'全量看一眼 - 注意
information_schema视图本身不缓存,大库执行略慢,但比连表查SHOW TABLE STATUS稳定
ENGINE 字段得逐表核对,靠配置、靠经验、靠文档都不如 SHOW TABLE STATUS 里那一行真实。











