05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查

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 延迟飙升 快照前停业务或低峰操作

十、要点速记

  1. 三大系统库分工:information_schema 查元数据、performance_schema 查性能、sys schema 是友好封装。
  2. 日常运维首选 sys schema :sys.processlist、sys.innodb_lock_waits、sys.statement_analysis 三件套。
  3. 慢 SQL 优化入口 :sys.statement_analysis + EXPLAIN + EXPLAIN ANALYZE。
  4. 锁排查流程 :sys.innodb_lock_waits → 找到 blocking_thread_id → KILL。
  5. 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 数据库全栈运维实战系列》日常运维篇。欢迎收藏、交流。

相关推荐
贞明电子3 小时前
工业三色报警灯怎么接入项目系统?开关量与RS485控制应用指南
运维·网络·微信公众平台·贞明电子
代码山河3 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
万联WANFLOW4 小时前
海外网络故障怎么排查?Cloudflare 三季度断网报告解读与 mtr 实战
运维·网络·故障分析
微订校园外卖平台5 小时前
校园外卖平台选模板还是定制:架构、数据流与验收清单
大数据·架构·外卖系统·本地生活·微订
小徐不徐说5 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
Ruiery6 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
论文复现现场6 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi6 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
Decay__7 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构