SHOW 与 information_schema 是什么
MySQL 的表、列、索引、约束、字符集、表大小这些结构信息有两种读法:SHOW 系列命令(SHOW TABLES、SHOW CREATE TABLE、SHOW INDEX)写法短,适合人看;information_schema 是一组标准视图,可以用 WHERE、JOIN、聚合随意筛选,适合脚本与批量审计。两者读的是同一份元数据,8.0 之后 information_schema 直接读数据字典,性能和一致性都明显好于 5.7。
基本信息
| 适用版本 | MySQL 5.7 / 8.0(8.0 的 information_schema 性能大幅提升) |
|---|---|
| 常用视图 | TABLES / COLUMNS / STATISTICS / KEY_COLUMN_USAGE / TABLE_CONSTRAINTS |
| 快捷命令 | SHOW TABLES、SHOW CREATE TABLE、SHOW INDEX FROM t |
| 权限要求 | 只能看到自己有权访问的对象 |
| 开销提醒 | 大实例全量扫描有代价,避开业务高峰 |
典型使用场景
- 盘点某库所有表与注释,导出成数据字典文档
- 审计索引:找出没有索引、索引列顺序可疑、索引重复的表
- 核对字段类型与字符集:迁移或跨库同步前的差异比对
- 统计表体积:按数据量排序,找出需要归档或分表的大表
- 发布前检查:确认某个字段、某个索引是否已经在生产环境存在
常用查询
常用查询
-- 列出库内所有基础表及其注释
SELECT table_name, engine, table_comment
FROM information_schema.tables
WHERE table_schema = 'appdb' AND table_type = 'BASE TABLE';
-- 按索引名聚合出每个索引的列顺序
SELECT index_name, GROUP_CONCAT(column_name ORDER BY seq_in_index) AS cols
FROM information_schema.statistics
WHERE table_schema = 'appdb' AND table_name = 'orders'
GROUP BY index_name;
-- 查看建表语句原文
SHOW CREATE TABLE appdb.orders\G表体积与字段核对
表体积与字段核对
-- 估算体积排序(table_rows 为估算值)
SELECT table_name, table_rows, ROUND((data_length + index_length) / 1024 / 1024) AS mb
FROM information_schema.tables
WHERE table_schema = 'appdb'
ORDER BY data_length DESC LIMIT 10;
-- 核对某字段的完整定义
SELECT column_name, column_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = 'appdb' AND table_name = 'orders' AND column_name = 'status';常用视图对照
| 视图 | 内容 | 典型用途 |
|---|---|---|
| TABLES | 表名、引擎、行数估算、注释 | 表清单与体积盘点 |
| COLUMNS | 字段类型、可空、默认值、字符集 | 结构比对与文档生成 |
| STATISTICS | 索引与列的对应关系、基数 | 索引审计、判断联合索引列序 |
| KEY_COLUMN_USAGE | 主键与外键列 | 约束梳理与依赖分析 |
| TABLE_CONSTRAINTS | 约束类型与名称 | 发布前核对唯一键是否存在 |
table_rows 来自统计信息,是估算值,用来观察容量趋势没问题,用来做账务核对一定会出错;需要精确行数只能 COUNT(*),或让应用侧维护计数表。
在业务高峰对 information_schema 做全库聚合可能持有元数据锁并长时间占用资源,脚本应加上 table_schema 与 table_name 限定条件,必要时放到从库或低峰执行。