show tables最快但仅显示当前库普通表;show full tables可区分表/视图;information_schema.tables功能全但受权限静默过滤影响,且table_rows为估算值。

直接用 SHOW TABLES 最快,但只显示当前库的普通表
这是最常用也最省事的方式,执行后立刻列出当前 USE 选中的数据库里所有用户创建的表。它不显示视图、系统表或临时表,也不管权限——只要你有对这个库的 SELECT 权限(实际只要 SHOW VIEW 或更基础的 USAGE),就能看到结果。
实操建议:
- 先确认当前库:
SELECT DATABASE();,避免在错的库下执行 - 如果返回空,可能当前没选库(
DATABASE()返回NULL),得先USE your_db; - 它默认不显示表类型,分不清哪些是视图——需要额外查
INFORMATION_SCHEMA.VIEWS - 不支持过滤条件,想筛表名得靠客户端处理(比如 MySQL CLI 里加
| grep "log")
查 INFORMATION_SCHEMA.TABLES 才能区分表/视图/系统表
SHOW TABLES 看不到的东西,基本都得靠这张元数据表。它字段全、可过滤、跨库可查,但要注意权限和性能:没有 SELECT 权限的库,对应行直接不出现;查询大库时可能稍慢(尤其 TABLE_ROWS 字段要统计)。
实操建议:
- 查当前库所有表+视图:
SELECT TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE(); - 只看基表(排除视图):
AND TABLE_TYPE = 'BASE TABLE' - 想包含系统表(如
mysql.user)?得显式指定TABLE_SCHEMA = 'mysql',且你有权限访问该库 -
TABLE_ROWS是估算值,MyISAM准确,InnoDB可能滞后,别拿它做精确计数依据
SHOW FULL TABLES 是 SHOW TABLES 的增强版,带类型标识
它比 SHOW TABLES 多一列 Table_type,能一眼看出哪行是 BASE TABLE、哪行是 VIEW。不查系统表,也不支持跨库,但胜在简洁直观,适合快速确认当前库里有没有视图混在表列表里。
实操建议:
- 语法就是
SHOW FULL TABLES;,加FROM other_db也能查别的库(需权限) - 想只看视图:
SHOW FULL TABLES WHERE Table_type = 'VIEW'; - 注意大小写:
'VIEW'必须全大写,MySQL 对这个字符串字面量是大小写敏感的 - 它不返回引擎、字符集等信息,真要这些还得回
INFORMATION_SCHEMA.TABLES
权限不足时,INFORMATION_SCHEMA 行为容易误判
如果你没被授予某个库的 SELECT 权限,查 INFORMATION_SCHEMA.TABLES 时,那个库的表就完全不会出现在结果里——不是报错,而是静默过滤。这跟 SHOW TABLES FROM other_db 报 Access denied 错误完全不同,容易让人以为“那个库根本没表”。
实操建议:
- 怀疑权限问题?先试
SHOW DATABASES;,看目标库是否在列表中(有SHOW DATABASES权限才可见) - 再用
SHOW TABLES FROM target_db;,如果报错,说明权限不够;如果返回空但库存在,大概率是INFORMATION_SCHEMA静默跳过了 - DBA 给权限时,常漏掉
INFORMATION_SCHEMA的SELECT授权,其实只需要给具体业务库就行,INFORMATION_SCHEMA本身不用额外授权
SHOW TABLES 和 INFORMATION_SCHEMA 的行为差异、权限静默过滤、TABLE_TYPE 字符串大小写,这几个点最容易在自动化脚本或跨环境迁移时出岔子。











