05_MySQL 常用 SQL 大全 ------ 诊断、管理、优化辅助 SQL 与三大系统库速查
系列定位 :《MySQL 数据库全栈运维实战系列》第 05 篇,与《Oracle 数据库全栈运维实战系列(VMware 版)》同构对标。适用版本 :MySQL 8.0(5.7 差异随文标注)。官方文档:MySQL 8.0 Reference Manual、information_schema / performance_schema / sys Schema。
一、三大系统库全景(类比 Oracle 数据字典)

图 1

图 2
| 系统库 | 作用 | 数据来源 | 类比 Oracle |
|---|---|---|---|
| information_schema | 元数据:表、列、索引、权限、字符集 | 数据字典 + 实时统计 | dba_/all_ |
| performance_schema | 运行时:语句、锁、事务、IO、等待事件 | 运行时采集(默认开启) | vsession / vsql / ASH |
| sys schema | 对 performance_schema 的友好封装,人类可读 | 底层来自 performance_schema | DBA_HIST / 诊断视图 |
使用建议 :- 查对象/元数据 →
information_schema- 查性能/等待/慢 SQL →performance_schema或sys- 日常运维首选 sys schema:命名直观、输出友好,8.0 自带。
二、information_schema 常用查询(元数据)

图 3
2.1 库表大小统计
-- 解释:各业务库大小排行(最常用)
SELECT TABLE_SCHEMA AS db_name,
ROUND(SUM(DATA_LENGTH)/1024/1024/1024, 2) AS data_gb,
ROUND(SUM(INDEX_LENGTH)/1024/1024/1024, 2) AS index_gb,
ROUND(SUM(DATA_LENGTH+INDEX_LENGTH)/1024/1024/1024, 2) AS total_gb,
COUNT(*) AS table_count
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql','sys','information_schema','performance_schema')
GROUP BY TABLE_SCHEMA
ORDER BY total_gb DESC;
2.2 查找大表
-- 解释:找出全库最大的 20 张表
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS,
ROUND((DATA_LENGTH+INDEX_LENGTH)/1024/1024/1024, 2) AS total_gb,
ENGINE
FROM information_schema.TABLES
ORDER BY (DATA_LENGTH+INDEX_LENGTH) DESC
LIMIT 20;
2.3 查找无索引表 / 缺索引表
-- 解释:找出有数据但没有任何索引的表(全表扫描风险)
SELECT t.TABLE_SCHEMA, t.TABLE_NAME, t.TABLE_ROWS
FROM information_schema.TABLES t
LEFT JOIN information_schema.STATISTICS s
ON t.TABLE_SCHEMA = s.TABLE_SCHEMA AND t.TABLE_NAME = s.TABLE_NAME
WHERE t.TABLE_SCHEMA NOT IN ('mysql','sys','information_schema','performance_schema')
AND s.TABLE_NAME IS NULL
AND t.TABLE_TYPE = 'BASE TABLE';
2.4 查找重复索引 / 冗余索引
-- 解释:sys schema 封装好的冗余索引视图
SELECT * FROM sys.schema_redundant_indexes;
2.5 查看列信息
-- 解释:查看某表的所有列定义(替代 DESC)
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_DEFAULT, EXTRA
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'appdb' AND TABLE_NAME = 't_order'
ORDER BY ORDINAL_POSITION;
2.6 查看表碎片率
-- 解释:Data_free 占比高说明碎片多,需 OPTIMIZE TABLE
SELECT TABLE_SCHEMA, TABLE_NAME,
ROUND(DATA_LENGTH/1024/1024, 2) AS data_mb,
ROUND(DATA_FREE/1024/1024, 2) AS free_mb,
ROUND(DATA_FREE/(DATA_LENGTH+1)*100, 2) AS frag_pct
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql','sys')
AND DATA_FREE > 10*1024*1024
ORDER BY DATA_FREE DESC;
三、performance_schema 常用查询(性能诊断)

图 4
3.1 慢 SQL Top N
-- 解释:按总耗时排序的慢 SQL 汇总(替代读 slow.log)
SELECT DIGEST_TEXT,
COUNT_STAR AS exec_count,
ROUND(SUM_TIMER_WAIT/1e12, 2) AS total_sec,
ROUND(AVG_TIMER_WAIT/1e12, 2) AS avg_sec,
SUM_ROWS_EXAMINED AS rows_examined,
SUM_ROWS_SENT AS rows_sent
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT NOT LIKE 'CREATE TEMPORARY%'
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10\G
3.2 锁等待分析
-- 解释:当前所有锁
SELECT * FROM performance_schema.data_locks\G
-- 解释:锁等待链(谁等谁)
SELECT r.ENGINE_LOCK_ID AS waiting_lock,
b.ENGINE_LOCK_ID AS blocking_lock,
r.REQUESTED_ENGINE_LOCK_ID
FROM performance_schema.data_lock_waits w
JOIN performance_schema.data_locks b
ON w.BLOCKING_ENGINE_LOCK_ID = b.ENGINE_LOCK_ID
JOIN performance_schema.data_locks r
ON w.REQUESTING_ENGINE_LOCK_ID = r.ENGINE_LOCK_ID;
3.3 表 IO 统计
-- 解释:哪些表读写最频繁(定位热点表)
SELECT OBJECT_SCHEMA, OBJECT_NAME,
COUNT_READ, COUNT_WRITE,
SUM_TIMER_READ/1e12 AS read_sec,
SUM_TIMER_WRITE/1e12 AS write_sec
FROM performance_schema.table_io_waits_summary_by_table
WHERE OBJECT_SCHEMA NOT IN ('mysql','sys','information_schema','performance_schema')
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
3.4 索引使用统计
-- 解释:哪些索引没被用过(可考虑删除)
SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE INDEX_NAME IS NOT NULL
AND COUNT_STAR = 0
AND OBJECT_SCHEMA NOT IN ('mysql','sys')
ORDER BY OBJECT_SCHEMA, OBJECT_NAME;
四、sys schema 常用查询(运维首选)
4.1 会话与连接
-- 解释:比 SHOW PROCESSLIST 更友好的视图
SELECT * FROM sys.processlist
WHERE COMMAND != 'Sleep'
ORDER BY TIMER_WAIT DESC
LIMIT 20\G
-- 解释:哪个用户连接最多
SELECT user, count, active FROM sys.host_summary;
4.2 慢查询汇总
-- 解释:sys 封装的慢 SQL Top 10(最常用)
SELECT * FROM sys.statement_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10\G
-- 解释:扫描行数远大于返回行数的 SQL(低效 SQL)
SELECT * FROM sys.statement_analysis
WHERE rows_examined > rows_sent * 10
ORDER BY rows_examined DESC
LIMIT 10;
4.3 锁等待
-- 解释:一键看谁阻塞谁(生产排障必备)
SELECT * FROM sys.innodb_lock_waits\G
4.4 库表大小
-- 解释:各库大小(比 information_schema 更直观)
SELECT * FROM sys.innodb_buffer_stats_by_schema;
-- 解释:哪些表占用 Buffer Pool 最多
SELECT * FROM sys.innodb_buffer_stats_by_table
ORDER BY allocated DESC
LIMIT 10;
4.5 配置参数检查
-- 解释:查看不是默认值的参数(找被改过的配置)
SELECT * FROM sys.config;
-- 解释:查看自动增长列当前值
SELECT * FROM sys.schema_auto_increment_columns;
五、日常运维 SQL 速查

图 5
5.1 用户与权限
-- 解释:查看某用户的权限
SHOW GRANTS FOR 'appuser'@'192.168.10.%';
-- 解释:查看所有用户
SELECT user, host, account_locked, password_last_changed
FROM mysql.user;
5.2 主从复制
-- 解释:主库当前 binlog 位点
SHOW MASTER STATUS;
-- 解释:从库复制状态
SHOW REPLICA STATUS\G -- 8.0;5.7 用 SHOW SLAVE STATUS\G
-- 解释:从库延迟(关键指标)
SHOW REPLICA STATUS\G
-- 看:Seconds_Behind_Source
5.3 binlog 管理
-- 解释:查看所有 binlog 文件
SHOW BINARY LOGS;
-- 解释:清理指定日期之前的 binlog
PURGE BINARY LOGS BEFORE '2026-10-01 00:00:00';
-- 解释:查看 binlog 事件内容(需 mysqlbinlog 命令行)
-- mysqlbinlog --start-position=154 --stop-position=500 /data/mysql/binlog/mysql-bin.000001
5.4 数据库参数
-- 解释:查看所有参数
SHOW VARIABLES;
-- 解释:模糊查找参数
SHOW VARIABLES LIKE 'innodb_buffer%';
-- 解释:运行时动态修改参数(无需重启)
SET GLOBAL max_connections = 1000;
-- 解释:查看运行状态计数器
SHOW GLOBAL STATUS LIKE 'Threads%';
六、EXPLAIN 执行计划(优化辅助)

图 6
-- 解释:查看执行计划(最常用的优化工具)
EXPLAIN SELECT * FROM t_order WHERE user_id = 100;
-- 解释:8.0 增强版 EXPLAIN ANALYZE(实际执行并打印每行耗时)
EXPLAIN ANALYZE SELECT * FROM t_order WHERE user_id = 100;
| EXPLAIN 列 | 说明 | 优化方向 |
|---|---|---|
| type | 访问类型:const > ref > range > index > ALL | ALL = 全表扫描,必须优化 |
| key | 实际使用的索引 | NULL = 没走索引 |
| rows | 预估扫描行数 | 越大越慢 |
| Extra | Using where / Using filesort / Using temporary | filesort/temporary 需优化 |
| possible_keys | 可能用到的索引 | 为空说明无索引可用 |
-- 解释:查看某表的索引
SHOW INDEX FROM appdb.t_order;
七、诊断 SQL 速查表(按场景)
| 场景 | SQL |
|---|---|
| 当前连接数 | SHOW STATUS LIKE 'Threads_connected'; |
| 最大连接数 | SHOW VARIABLES LIKE 'max_connections'; |
| 当前锁等待 | SELECT * FROM sys.innodb_lock_waits; |
| 长事务 | SELECT * FROM information_schema.innodb_trx WHERE ... |
| 慢 SQL Top 10 | SELECT * FROM sys.statement_analysis ORDER BY ... |
| 大表排行 | SELECT * FROM information_schema.TABLES ORDER BY ... |
| 库大小 | SELECT TABLE_SCHEMA, SUM(DATA_LENGTH) FROM information_schema.TABLES ... |
| 复制延迟 | SHOW REPLICA STATUS\G 看 Seconds_Behind_Source |
| Buffer Pool 命中率 | SHOW ENGINE INNODB STATUS\G |
| binlog 位点 | SHOW MASTER STATUS; |
八、VMware 虚机注意事项
| 项 | 建议 |
|---|---|
| performance_schema 开销 | 约 5~10% 性能开销,8.0 默认开启,生产保持开启 |
| sys schema 依赖 | 依赖 performance_schema,不要关闭 |
| 大结果集查询 | 不要在生产直接跑无 LIMIT 的大查询,VMware 内存有限 |
| EXPLAIN ANALYZE | 会真实执行 SQL,大表慎用 |
九、踩坑记录(实测汇总)
| # | 坑 | 现象 | 解决 |
|---|---|---|---|
| 1 | 用 information_schema 看行数不准 | TABLE_ROWS 是估算值 | InnoDB 行数是采样估算,精确行数用 COUNT(*) |
| 2 | performance_schema 没开 | 锁/慢 SQL 查不了 | 确认 performance_schema=ON(8.0 默认开) |
| 3 | sys schema 没装 | 查 sys.processlist 报错 | 8.0 自带,5.7 需手动安装 |
| 4 | SHOW PROCESSLIST 只看到当前用户 | 普通用户看不到其他连接 | 用 root 或 PROCESS 权限账号查询 |
| 5 | EXPLAIN type=ALL | 全表扫描性能差 | 加索引或改写 SQL |
| 6 | data_locks 看不懂 | 锁信息太原始 | 用 sys.innodb_lock_waits 封装视图 |
| 7 | 长事务导致 undo 膨胀 | 磁盘空间不够 | 及时 KILL 长事务,开监控告警 |
| 8 | 索引统计信息过期 | 优化器选错索引 | ANALYZE TABLE 更新统计信息 |
| 9 | SHOW STATUS 数据太大 | 输出几千行 | 用 LIKE 过滤,或查 performance_schema |
| 10 | VMware 快照时跑大查询 | IO 延迟飙升 | 快照前停业务或低峰操作 |
十、要点速记
- 三大系统库分工:information_schema 查元数据、performance_schema 查性能、sys schema 是友好封装。
- 日常运维首选 sys schema :
sys.processlist、sys.innodb_lock_waits、sys.statement_analysis三件套。 - 慢 SQL 优化入口 :
sys.statement_analysis+EXPLAIN+EXPLAIN ANALYZE。 - 锁排查流程 :
sys.innodb_lock_waits→ 找到 blocking_thread_id → KILL。 - EXPLAIN 看 type 和 key:type=ALL 或 key=NULL 是重点优化对象。
十一、参考资料(官方正式文档)
| 主题 | 官方链接 |
|---|---|
| MySQL 8.0 Reference Manual | https://dev.mysql.com/doc/refman/8.0/en/ |
| The INFORMATION_SCHEMA Tables | https://dev.mysql.com/doc/refman/8.0/en/information-schema.html |
| MySQL Performance Schema | https://dev.mysql.com/doc/refman/8.0/en/performance-schema.html |
| MySQL sys Schema | https://dev.mysql.com/doc/refman/8.0/en/sys-schema.html |
| EXPLAIN Output Format | https://dev.mysql.com/doc/refman/8.0/en/explain-output.html |
| EXPLAIN ANALYZE | https://dev.mysql.com/doc/refman/8.0/en/explain-analyze.html |
| SHOW STATUS | https://dev.mysql.com/doc/refman/8.0/en/show-status.html |
本文章属于《MySQL 数据库全栈运维实战系列》日常运维篇。欢迎收藏、交流。