直接查询information_schema.tables表即可获取MyISAM引擎表,WHERE ENGINE = 'MyISAM'精确匹配,需加TABLE_SCHEMA条件限定数据库,注意大小写敏感及权限配置。

直接查 information_schema.tables 就行,别绕路
MySQL 把所有表的元信息都存进 information_schema.tables 里了,ENGINE 字段明确标着引擎类型。只要加个 WHERE ENGINE = 'MyISAM' 就能筛出来,不需要 JOIN 其他表,也不用查 SHOW ENGINES 或 SHOW TABLE STATUS 这类命令来间接推断。
常见错误是漏写 TABLE_SCHEMA 条件,导致查出所有数据库里的 MyISAM 表(包括系统库),而实际只想看某个业务库。如果只关心当前库,可以用 WHERE TABLE_SCHEMA = DATABASE();如果指定库名,就写死成 WHERE TABLE_SCHEMA = 'your_db_name'。
-
TABLE_SCHEMA是数据库名,不是SCHEMA_NAME(后者不存在) - 引擎名大小写敏感:必须写
'MyISAM',不能写'myisam'或'MYISAM' - MySQL 8.0+ 默认禁用
INFORMATION_SCHEMA的部分字段权限,确保账号有SELECT权限在该库上
执行这条 SQL 就够了
最简实用语句:
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables WHERE ENGINE = 'MyISAM';
如果只想看当前数据库下的 MyISAM 表:
SELECT TABLE_NAME FROM information_schema.tables WHERE TABLE_SCHEMA = DATABASE() AND ENGINE = 'MyISAM';
注意:DATABASE() 返回当前默认库名,不是连接时指定的 host 或用户;如果没选库就执行,结果为空。
为什么不用 SHOW TABLE STATUS?
虽然 SHOW TABLE STATUS LIKE '%' 也能看到 Engine 列,但它本质是逐库扫描、性能差,且结果集结构不标准(列名带空格、类型不一致),没法直接 JOIN 或嵌套子查询。更麻烦的是,它不返回 TABLE_SCHEMA,跨库查询时容易混淆。
另外,SHOW TABLE STATUS 在 MySQL 8.0 中已被标记为“legacy”,官方文档建议优先用 information_schema 查询。
-
SHOW TABLE STATUS不支持WHERE,只能靠客户端过滤,效率低 - 某些托管环境(如阿里云 RDS)会限制
SHOW类命令的并发数,但不限制SELECT查询 -
information_schema.tables的ENGINE字段是精确匹配,而SHOW输出的Engine列可能含空格或缩写(如MyISAM带尾部空格)
查完发现没结果?先确认这三件事
MyISAM 在 MySQL 5.7 后已逐步被弃用,8.0 默认禁用,所以查不到很可能是环境本身就不支持——不是 SQL 写错了。
- 运行
SHOW ENGINES;看MyISAM行的SUPPORT列是不是YES(不是DISABLED或NO) - 检查 MySQL 配置文件有没有
skip-myisam—— 有就说明启动时强制禁用了 - 确认表确实是 MyISAM:有些表建表时没显式指定
ENGINE=MyISAM,但用了旧版本备份恢复,可能被自动转成 InnoDB(尤其 MySQL 5.6+ 默认引擎变更后)
真正要迁移或审计 MyISAM 表时,得先确认它还活着;否则再准的 SQL 也查不出东西。


















