慢 SQL 监控
1. 功能概述
慢 SQL 监控功能帮助 DBA 和开发者实时发现数据库中的性能瓶颈。通过监控执行时间超过阈值的 SQL 语句,分析历史 Top SQL,以及查看锁等待链,快速定位并解决性能问题。
核心能力:
- 实时慢 SQL 监控,支持自定义阈值
- 历史 Top SQL 统计与排序
- 阻塞链分析,可视化锁依赖关系
- 在线 EXPLAIN 执行计划分析
- 一键终止问题会话
2. 进入慢 SQL 监控
慢 SQL 监控集成在 服务器管理 中。操作步骤:
- 进入 数据源管理 页面
- 找到目标数据源,点击操作栏的 服务器管理 按钮
- 在弹出的服务器管理窗口中,切换到 慢 SQL 标签页
前提条件:系统会自动进行前置检查(如 MySQL 的
performance_schema是否启用)。如果不满足条件,页面顶部会显示提示信息。
3. 实时慢 SQL
实时慢 SQL 标签页展示当前正在执行的、超过设定阈值的 SQL 语句。
3.1 阈值设置
在页面顶部的下拉框中选择慢 SQL 阈值:
| 阈值 | 适用场景 |
|---|---|
| 1 秒 | 高并发 OLTP 系统,对响应时间敏感 |
| 2 秒 | 常规 Web 应用 |
| 5 秒 | 混合负载系统 |
| 10 秒 | 报表类查询为主 |
| 30 秒 | 数据仓库、批量处理 |
| 60 秒 | 仅关注极端慢查询 |
选择阈值后,点击 刷新 按钮加载数据。
3.2 列表说明
| 列名 | 说明 |
|---|---|
| 会话 ID | 数据库会话标识 |
| 用户 | 执行 SQL 的数据库用户 |
| 数据库 | 目标数据库名 |
| 执行时长 | SQL 已执行时间。红色表示超过 10 秒,橙色表示超过 5 秒 |
| SQL 文本 | 正在执行的 SQL 语句 |
| 等待事件 | 当前等待的事件类型 |
| 标签 | 自动分类标记 |
| 操作 | EXPLAIN(查看执行计划)、KILL(终止会话) |
3.3 自动标签
系统会根据 SQL 的状态自动添加标签:
- 阻塞链(红色):该 SQL 正在阻塞其他会话
- 阻塞源(橙色):该 SQL 被其他会话阻塞
- 严重超时:执行时间远超阈值
- 全表扫描:检测到全表扫描操作
3.4 终止会话
对于长时间阻塞或异常的会话,可以点击 KILL 按钮终止。系统会弹出确认对话框,确认后执行 KILL 命令。
注意:终止会话会中断正在执行的操作,请确认该会话可以安全终止。
4. 历史 Top SQL
历史 Top SQL 标签页展示数据库中累计执行次数最多或平均耗时最长的 SQL 语句。
4.1 列表说明
| 列名 | 说明 |
|---|---|
| SQL | SQL 语句文本 |
| 调用次数 | 累计执行次数(可排序) |
| 平均耗时 | 平均执行时间(可排序) |
| 操作 | EXPLAIN(查看执行计划) |
4.2 使用建议
- 按 调用次数 排序,找出频繁执行的 SQL,考虑添加缓存或优化
- 按 平均耗时 排序,找出最慢的 SQL,重点优化执行计划
- 点击 EXPLAIN 查看执行计划,分析是否存在全表扫描等问题
5. 阻塞链
阻塞链标签页展示当前数据库中的锁等待关系,帮助快速识别阻塞源头。
5.1 列表说明
| 列名 | 说明 |
|---|---|
| 阻塞者 ID | 持有锁的会话 ID(红色标签) |
| 被阻塞 ID | 等待锁的会话 ID(橙色标签) |
| 深度 | 阻塞链的深度,1 表示直接阻塞 |
5.2 分析方法
- 找到 阻塞者 ID,这是持有锁且未释放的会话
- 查看对应的 被阻塞 ID,了解有多少会话被阻塞
- 在 实时慢 SQL 标签页中找到阻塞者的 SQL 语句
- 决定是否需要终止阻塞者会话,或使用 EXPLAIN 分析其执行计划
6. 执行计划分析
EXPLAIN 功能帮助分析 SQL 的执行计划,找出性能瓶颈。
6.1 使用步骤
- 在实时慢 SQL 或历史 Top SQL 列表中,点击 EXPLAIN 按钮
- 弹出 EXPLAIN 对话框,显示原始 SQL
- 可以编辑 SQL 文本(如添加提示、修改条件等)
- 点击 执行 EXPLAIN 按钮
- 查看执行计划结果
6.2 结果展示
- 普通格式:以表格形式展示执行计划(适用于 MySQL、PostgreSQL 等)
- XML 格式:SQL Server 返回 XML 格式的执行计划,系统会自动格式化缩进
6.3 复制结果
点击 复制 按钮可以将执行计划复制到剪贴板,方便粘贴到文档或分享给团队。
7. 支持的数据库
| 数据库 | 支持情况 | 说明 |
|---|---|---|
| MySQL | 完整支持 | 需要启用 performance_schema |
| PostgreSQL | 完整支持 | 通过 pg_stat_activity 和 pg_stat_statements |
| SQL Server | 完整支持 | 通过 DMV 视图 |
| Oracle | 部分支持 | 通过 V$SESSION 和 V$SQL |
| SQLite | 不支持 | SQLite 为嵌入式数据库,无独立进程监控 |
8. 最佳实践
- 定期巡检:每天查看历史 Top SQL,提前发现潜在性能问题
- 合理设置阈值:根据业务场景选择合适的阈值,避免过多噪音或遗漏
- 结合执行计划:发现慢 SQL 后,务必使用 EXPLAIN 分析执行计划
- 谨慎终止会话:终止前确认该会话不是关键业务操作
- 关注阻塞链:阻塞链会导致大量请求堆积,应优先处理