首页/数据/数据库速查/SHOW DATABASES 与库表清单查看

SHOW DATABASES 与库表清单查看

盘点实例有哪些库、库下有哪些表;SHOW 系列命令最直接,information_schema.tables 可带引擎、行数与容量排序。

数据库速查数据更新于 2026-10-13

SHOW DATABASES 是什么

SHOW DATABASES 用来盘点一个实例里有哪些库,配合 SHOW TABLES、SHOW TABLE STATUS 可以继续看清库下有什么表、多大的表、多大索引、多少碎片。这几条命令本质是 information_schema 里元数据表的语法糖,而 information_schema 的统计值来自存储引擎的估算。8.0 把元数据收进了数据字典,SHOW 系列不再扫描数据目录,速度与一致性都比 5.7 明显更好。

基本信息

用途库表清单与元数据盘点
常用命令SHOW DATABASES / SHOW TABLES / SHOW TABLE STATUS / SHOW INDEX
元数据源information_schema.tables、statistics
权限要求对目标库有任意权限即可看到,全局权限可看全部
版本差异8.0 元数据来自数据字典,5.7 为文件系统扫描
典型耗时毫秒级,但 information_schema 上做 JOIN 会放大开销

典型使用场景

  • 接手一台陌生实例:先列库、再分业务,避免把系统库当垃圾库清理
  • 迁移前估算体量:按数据加索引的字节数判断走逻辑导出还是物理备份
  • 排查表不见了的报错:确认是当前账号没权限,还是对象确实不存在
  • 找出需要归档或重建的大表与碎片表,作为清理与优化清单
  • 核对引擎与排序规则:把遗留的 MyISAM、utf8 老表挑出来做改造
  • 统计表与分区数量,为 DDL 停机窗口和备份耗时做预估

常用查看

常用查看
SHOW DATABASES;   # 只列出当前账号有权限的库
USE appdb;   # 切换默认库,之后语句可省略库名前缀
SHOW TABLES LIKE 'order%';   # 按前缀模糊匹配表名
SHOW TABLE STATUS LIKE 'orders'\G   # 单表详情,竖排输出看得清
SELECT DATABASE();   # 确认当前默认库,避免改错对象
SHOW FULL TABLES WHERE Table_type='VIEW';   # 只看视图,排查同名视图遮蔽表

SHOW TABLE STATUS 读法

列含义判读要点
Name表名同名视图也会出现在这里,靠 Engine 区分
Engine存储引擎为空通常是视图;MyISAM 属历史遗留需改造
RowsInnoDB 的估算行数偏差可达数十个百分点,精确值要用 COUNT(*)
Data_length数据文件占用字节估算容量与导出大小的主要依据
Index_length索引占用字节长期大于数据量说明索引冗余或设计有问题
Data_free表空间碎片字节持续变大考虑重建表回收空间
Collation排序规则8.0 默认 utf8mb4_0900_ai_ci,混用会引发比较与连接问题

按容量排序找大表

按容量排序找大表
SELECT table_name, engine, table_rows,
       ROUND((data_length+index_length)/1024/1024, 2) AS total_mb,
       ROUND(data_free/1024/1024, 2) AS free_mb
FROM information_schema.tables
WHERE table_schema='appdb' AND table_type='BASE TABLE'   # 排除视图
ORDER BY data_length+index_length DESC
LIMIT 20;   # 大表清单,用于归档与优化排期
SHOW DATABASES 只显示当前账号有权限的库,清单里少了某个库通常是被收窄了授权,而不是库被删了;用 SHOW GRANTS FOR CURRENT_USER() 就能核对到底哪些库还在授权范围内。
在 information_schema 上做全表 JOIN、GROUP BY 或大范围聚合,会触发元数据的大量读取,实例表数量上千时可能拖慢甚至阻塞其他会话的元数据操作,查询务必带上 table_schema 条件并限制返回行数。
不要凭 SHOW TABLES 看起来是空的就把库当成可清理对象:DROP DATABASE 不参与事务、无法回滚,执行前先确认备份可用并核对库名与字符集。

按库统计规模

按库统计规模
SELECT table_schema, COUNT(*) AS tables,
       ROUND(SUM(data_length+index_length)/1024/1024, 2) AS total_mb   # 该库的数据加索引总量
FROM information_schema.tables
WHERE table_type='BASE TABLE'
GROUP BY table_schema
ORDER BY total_mb DESC;   # 按库排序,一眼看出谁是大户
改结构或加索引之前,用 SHOW CREATE TABLE 与 SHOW INDEX 看清既有定义:能避免重复建索引、也能发现业务依赖的列,比只看表名清单可靠得多。

易错点

  • 把 table_rows 当精确行数用:InnoDB 的估算值偏差可观,做容量规划或分页判断时要么 COUNT(*),要么用采样估算
  • 不带 table_schema 条件就查 information_schema:在表数量多的实例上会读到大量无关对象,慢查询与元数据锁风险同时上升
  • 看到库清单变短就认定数据丢失:多数情况是账号授权被调整,先核对授权再决定是否需要恢复
  • 忽略 lower_case_table_names 与大小写敏感性:同一份脚本在 Linux 与 Windows 上表名匹配结果不同,迁移前必须统一命名策略
  • 用 SHOW TABLES 断言某张表不存在:它查的是当前默认库,没先 USE 或没写库名前缀就会得出错误结论
  • 把元数据统计当成实时快照:统计信息有刷新时机,刚做完大批量导入时行数与容量可能还没更新,判断前先看统计是否已重算

数据来源与参考

  • MySQL 8.0 Reference Manual: SHOW DATABASES Statement

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌