sys 库的定位
官方把 performance_schema 的原始表封装成人类可读的视图,统一放在 sys 库里:语句开销排行、锁等待链条、冗余索引、未使用索引、IO 热点都能一条 SQL 查到。它不额外采集数据,只是把已有监控信息翻译成人话,因此视图的时效性与采样范围仍受 performance_schema 配置约束。
基本信息
| 适用平台 | MySQL 5.7+、MariaDB 10.6+ 自带 |
|---|---|
| 依赖 | performance_schema 需开启(默认开启) |
| 高频视图 | statement_analysis、innodb_lock_waits、schema_unused_indexes |
| 权限 | 访问部分视图需要 PROCESS 权限 |
| 注意 | 视图查询本身也有开销,避免高频轮询 |
典型使用场景
- 定位谁在消耗资源:按语句模板看总耗时、平均耗时与扫描行数排行
- 排查锁等待:直接拿到阻塞方与被阻塞方的线程与 SQL,不必手工拼表
- 索引治理:列出从未被使用的索引与冗余索引,作为清理候选
- IO 热点分析:按文件或按表查看读写字节数,定位大表扫描
- 连接与会话总览:按用户、按主机汇总连接数与语句负载
常用视图
常用视图
-- 语句开销排行(归一化后的模板)
SELECT * FROM sys.statement_analysis LIMIT 10;
-- 锁等待链条:谁在阻塞谁
SELECT * FROM sys.innodb_lock_waits\G
-- 从未使用过的索引,可作删除候选
SELECT * FROM sys.schema_unused_indexes;
-- 冗余索引(被其他索引前缀覆盖)
SELECT * FROM sys.schema_redundant_indexes;
-- 当前连接与执行的语句
SELECT * FROM sys.processlist WHERE command <> 'Sleep';常用视图与用途
| 视图 | 看什么 | 使用提示 |
|---|---|---|
| statement_analysis | 语句模板的耗时、执行次数、扫描行数 | 按 avg_latency 或 rows_examined 排序 |
| innodb_lock_waits | 阻塞方、被阻塞方、等待时长 | 可直接作为 kill 决策依据 |
| schema_unused_indexes | 自实例启动以来未被使用的索引 | 需先稳定运行足够时间再采信 |
| schema_redundant_indexes | 被其他索引覆盖的冗余索引 | 删除前确认无特殊用途 |
| io_global_by_file_by_bytes | 按文件统计读写字节 | 定位大表扫描与临时文件 |
| user_summary_by_statement_latency | 按用户汇总语句延迟 | 区分应用账号的资源占用 |
sys 视图是聚合结果,数据源仍是 performance_schema:如果 events_statements 相关消费者被关闭,视图会返回空或只有极少量数据,排查前先确认采集已开启。
schema_unused_indexes 的结论要谨慎使用:实例重启后统计会清零,业务还有周期性任务(月初报表、季度结算)时,长期未使用不等于可以删除。