一文读懂SQL元数据操作
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
SQL元数据就是描述数据库中数据的数据,就像数据的“户口本”,记录着数据的结构、属性和关系等信息,帮助我们理解和管理数据库,分类如下:
SQL元数据操作常见方法有:用 下面简单介绍几种常见的SQL元数据操作方法,仅供参考: 一、通过 |
SCHEMA_NAME | 数据库名称 |
应用示例:
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'test_db';
模拟输出:
语法结构:
SELECT * FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name';
语法元素:
TABLES
:系统视图,存储表元数据TABLE_SCHEMA
(指定数据库名)返回值:
ENGINE 存储引擎(InnoDB/MyISAM等)
应用示例:
SELECT TABLE_NAME, ENGINE, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'test_db';
模拟输出:
语法结构:
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = 'table_name';
语法元素:
COLUMNS
:系统视图,存储列元数据TABLE_SCHEMA
和TABLE_NAME
返回值:
COLUMN_NAME 列名 DATA_TYPE 数据类型(int/varchar等) EXTRA 额外信息(如auto_increment)
应用示例:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'test_db'
AND TABLE_NAME = 'user';
模拟输出:
语法结构:
SELECT * FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = 'table_name';
语法元素:
STATISTICS
:系统视图,存储索引元数据TABLE_SCHEMA
和TABLE_NAME
返回值:
NON_UNIQUE 是否唯一(0=唯一,1=非唯一)
应用示例:
SELECT INDEX_NAME, COLUMN_NAME, NON_UNIQUE
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'test_db'
AND TABLE_NAME = 'user';
模拟输出:
语法结构:
SELECT
table_name AS 'Table',
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.TABLES
WHERE table_schema = 'database_name';
语法元素:
DATA_LENGTH
:数据存储空间INDEX_LENGTH
:索引存储空间/1024/1024
(字节→MB)应用示例:
SELECT table_name,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS size_mb
FROM information_schema.TABLES
WHERE table_schema = 'test_db';
模拟输出:
SHOW
语句获取元数据语法结构:
SHOW DATABASES;
返回值:
应用示例:
SHOW DATABASES;
模拟输出:
语法结构:
SHOW CREATE DATABASE db_name;
返回值:
DEFAULT CHARACTER SET
应用示例:
SHOW CREATE DATABASE test_db;
模拟输出:
test_db
/*!40100 DEFAULT CHARACTER SET utf8mb4 */
语法结构:
-- 查看当前库表
SHOW TABLES;
-- 查看指定库表
SHOW TABLES FROM db_name;
-- 查看表详情
SHOW TABLE STATUS FROM db_name;
返回值差异:
SHOW TABLES
SHOW TABLE STATUS
应用示例:
SHOW TABLE STATUS FROM test_db;
模拟输出:
语法结构:
-- 表创建语句
SHOW CREATE TABLE tbl_name;
-- 列信息
SHOW COLUMNS FROM tbl_name;
-- 索引信息
SHOW INDEX FROM tbl_name;
核心返回值对比:
SHOW CREATE TABLE
SHOW COLUMNS
SHOW INDEX
应用示例:
SHOW INDEX FROM user;
模拟输出:
DESCRIBE
获取元数据语法结构:
DESCRIBE tbl_name; -- 完整写法
DESC tbl_name; -- 简写
等价关系:
DESC user ≡ SHOW COLUMNS FROM user;
返回值:
应用示例:
DESC user;
模拟输出:
TABLE_ROWS
不准确问题
TABLE_ROWS
基于统计采样估算-- 精确行数(消耗大)
SELECT COUNT(*) FROM table;
-- 定时更新统计
ANALYZE TABLE table;
元数据查询锁机制
information_schema
可能触发全局锁SET SESSION transaction_read_only = ON; -- 开启只读事务
查询性能优化
-- 低效(全量扫描)
SHOW TABLE STATUS;
-- 高效替代(精准过滤)
SELECT * FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'db'
AND TABLE_NAME IN ('t1','t2');
表大小精度问题
DATA_LENGTH
包含缓冲池未刷新数据du -sh /var/lib/mysql/db_name/*.ibd
Q:SHOW TABLE STATUS
显示的行数为什么与SELECT COUNT(*)
不同?
A:InnoDB的MVCC机制导致行数具有多版本特性,TABLE_ROWS
仅为估算值
Q:如何获取数据库中的所有外键约束?
A:
SELECT
TABLE_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;
Q:如何检测未使用的索引?
A:
SELECT *
FROM sys.schema_unused_indexes; -- MySQL 5.6+
Q:为什么information_schema查询比SHOW慢?
A:information_schema需解析视图结构,而SHOW直接读取缓存
Q:如何安全获取生产环境元数据?
A:
SET SESSION transaction_read_only = ON;
START TRANSACTION;
SHOW TABLES;
COMMIT;
Q:如何获取表的精确大小?
A:
-- InnoDB独立表空间
SELECT file_name, allocated_size
FROM information_schema.INNODB_SYS_TABLESPACES
WHERE NAME LIKE 'db/table';
Q:如何查看活跃的事务锁?
A:
SELECT * FROM information_schema.INNODB_TRX; -- 活动事务
SELECT * FROM performance_schema.data_locks; -- 持有锁
实践建议:
交互操作 → SHOW
/DESC
程序调用 → information_schema
性能敏感 → 避免全量扫描 数据精度 → 区分估算值与精确值 生产环境 → 使用只读事务
阅读原文:原文链接