前言:很多开发、DBA 日常都需要拿到库表结构、字段注释、索引信息,有的人依赖 Navicat、DBeaver 导出,但是在自动化脚本、线上无客户端环境、审计同步场景下,必须直接从 MySQL 数据字典查询。MySQL 8.0 把底层数据字典从文件改成了内置字典表,和 5.7 的
INFORMATION_SCHEMA使用上有不少差异,本文带你梳理获取数据字典的几种方式、常用 SQL、踩坑点。
一、先搞懂:MySQL 数据字典是什么
简单说:数据字典就是数据库自己存元数据的集合,包含库名、表名、字段、类型、长度、注释、主键、索引、外键、分区、字符集、权限等信息。
- MySQL 5.7:元数据存在
INFORMATION_SCHEMA,底层是临时视图,数据从.frm文件读取 - MySQL 8.0:引入独立数据字典(Data Dictionary),底层是隐藏的
mysql库下字典表,INFORMATION_SCHEMA依然保留,作为兼容视图给我们查询使用
重点:业务代码、自动化脚本,优先使用 INFORMATION_SCHEMA,不要直接操作底层隐藏字典表,底层表结构版本之间会变动,不兼容。
二、方式1:通过 INFORMATION_SCHEMA 查询(最常用)
INFORMATION_SCHEMA 是只读虚拟库,不能 USE 修改,只能 SELECT 查询,下面是高频场景 SQL。
1. 查询所有数据库列表
sql
SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
ORDER BY SCHEMA_NAME;
2. 查询指定库下所有表信息(表名、引擎、注释、创建时间)
sql
SELECT
TABLE_NAME,
TABLE_COMMENT,
ENGINE,
TABLE_ROWS,
CREATE_TIME,
UPDATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '你的库名'
ORDER BY TABLE_NAME;
注意:
TABLE_ROWS是 InnoDB 估算值,不是精确 count(*),不能用来统计准确行数。
3. 查询单表字段详情(字段名、类型、长度、是否为空、默认值、注释、主键)
这个是大家用得最多的,自动生成文档、同步结构脚本基本都靠这条:
sql
SELECT
COLUMN_NAME,
DATA_TYPE,
COLUMN_TYPE,
IS_NULLABLE,
COLUMN_DEFAULT,
COLUMN_COMMENT,
COLUMN_KEY,
EXTRA
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = '你的库名'
AND TABLE_NAME = '你的表名'
ORDER BY ORDINAL_POSITION;
字段说明:
ORDINAL_POSITION:字段顺序COLUMN_KEY:PRI=主键,UNI=唯一键,MUL=普通索引EXTRA:auto_increment自增标识
4. 查询索引信息(索引名、索引字段、是否唯一)
sql
SELECT
INDEX_NAME,
NON_UNIQUE,
SEQ_IN_INDEX,
COLUMN_NAME,
INDEX_COMMENT
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = '你的库名'
AND TABLE_NAME = '你的表名'
ORDER BY INDEX_NAME,SEQ_IN_INDEX;
NON_UNIQUE=0 代表唯一索引 / 主键。
5. 查询外键信息
sql
SELECT
CONSTRAINT_NAME,
COLUMN_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = '你的库名'
AND TABLE_NAME = '你的表名'
AND REFERENCED_TABLE_NAME IS NOT NULL;
三、方式2:SHOW 系列命令(快速查看,适合手工调试)
SHOW 本质上 MySQL 内部也是查询 INFORMATION_SCHEMA,语法简短,适合在客户端手动查看,但是不方便程序解析(输出格式不好处理)。
sql
-- 查看所有库
SHOW DATABASES;
-- 查看库下面所有表
SHOW TABLES;
-- 查看表结构
SHOW FULL COLUMNS FROM 表名;
-- 查看索引
SHOW INDEX FROM 表名;
-- 查看建表语句(非常好用,直接拿到 DDL)
SHOW CREATE TABLE 表名;
适合人看,不推荐自动化程序解析,不同版本返回格式有差异。
四、方式3:MySQL 8.0 底层数据字典表(不推荐业务使用)
8.0 底层字典放在 mysql 库,是一堆隐藏表:mysql.tables、mysql.columns、mysql.indexes。
这些表默认不允许普通用户直接访问,并且版本升级随时调整字段 ,官方不建议直接查询。
✅ 原则:应用层、脚本一律走 INFORMATION_SCHEMA,底层字典表只供内核开发研究。
五、方式4:工具导出(人工文档场景)
如果不需要代码获取,只是导出文档:
- Navicat / DBeaver / DataGrip:自带导出表结构、生成 Markdown/Word 文档功能
- mysqldump:导出建表语句,只导出结构不加数据
bash
mysqldump -u用户名 -p密码 -d 库名 > table_ddl.sql
-d 参数代表只导出表结构,不导出数据,相当于拿到全库的 DDL 字典。
六、生产踩坑清单(非常重要)
坑1:权限不足查不到信息
普通账号如果没有对应库权限,INFORMATION_SCHEMA 里看不到对应库、表。
权限:至少需要
SELECT权限。审计账号建议最小权限分配,不要随便给 ALL PRIVILEGES。
坑2:InnoDB 的 TABLE_ROWS 不准
InnoDB 是聚簇索引,TABLE_ROWS 是采样估算值,大数据量表误差很大,不能用于统计业务数据量。MyISAM 这个值是准确的。
坑3:区分大小写问题
Linux 环境 MySQL 默认表名区分大小写,在 WHERE 条件里库名、表名大小写写错会查不到;Windows 默认不区分。
坑4:INFORMATION_SCHEMA 查询性能
库和表数量巨大(上万张表)的时候,直接查 COLUMNS / STATISTICS 会很慢,会扫描元数据,不要高频循环查询。
优化方案:定时缓存元数据到自己的业务库,不要实时高频拉取。
坑5:8.0 和 5.7 字段差异
少数字段(比如 CHECK 约束相关)在 5.7 的 INFORMATION_SCHEMA 没有,5.7 本身不支持 check 生效;8.0 完整支持,字典信息会多出对应记录。
七、实战场景:自动生成表结构文档脚本思路
很多小伙伴拿到元数据之后,想自动输出 Markdown:
- 连接 MySQL
- 先查
TABLES获取所有表+表注释 - 循环每张表,查询
COLUMNS获取字段列表 - 拼接 Markdown 表格输出
这套逻辑就是市面上很多数据库文档工具的底层原理。
八、总结
- 程序自动化获取元数据:优先 INFORMATION_SCHEMA,SQL 稳定、跨版本兼容性最好;
- 人工快速查看:用 SHOW 命令、图形客户端;
- 备份全量 DDL:mysqldump -d;
- 底层 mysql 库原生字典表:不要碰,风险高,无兼容承诺;
- 元数据查询属于高频审计、文档同步场景,注意控制查询频率,避免元数据查询拖慢数据库。