name: slow-query-analyzer description: 数据库慢查询日志分析和 SQL 性能优化工具。支持 MySQL、PostgreSQL 慢查询日志解析,SQL 执行计划分析,索引优化建议,生成优化报告。用于诊断数据库性能问题、优化慢 SQL、提升查询效率。 metadata: openclaw: emoji: 🐢 requires: config: [] tools: ["exec", "read"]
Slow Query Analyzer - 慢查询分析工具
专业的数据库慢查询分析工具,支持多种数据库的慢查询日志解析和 SQL 性能优化。
支持的数据库
| 数据库 | 慢查询日志 | 执行计划分析 | 索引建议 |
|---|---|---|---|
| MySQL | ✅ | ✅ | ✅ |
| PostgreSQL | ✅ | ✅ | ✅ |
| MariaDB | ✅ | ✅ | ✅ |
| TiDB | ✅ | ✅ | ⚠️ |
🚀 快速开始
1. 分析 MySQL 慢查询日志
# 分析本地慢查询日志
python3 scripts/analyze_mysql_slow.py /var/log/mysql/slow.log
# 分析并生成报告
python3 scripts/analyze_mysql_slow.py slow.log --format html --output report.html
# 只显示耗时前 10 的查询
python3 scripts/analyze_mysql_slow.py slow.log --top 10
2. 分析单条 SQL
# 获取执行计划并分析
python3 scripts/analyze_sql.py "SELECT * FROM users WHERE email LIKE '%test%'" \
--db mysql --host localhost --user root --database mydb
3. 批量分析 SQL 文件
# 分析文件中的所有 SQL
python3 scripts/analyze_sql_file.py queries.sql --db mysql --format json
📊 分析维度
慢查询日志分析
- 查询频率 - 哪些查询被执行最多
- 总耗时 - 累积执行时间最长的查询
- 平均耗时 - 单次执行最慢的查询
- 扫描行数 - 读取数据量过大的查询
- 返回行数 - 返回结果集过大的查询
SQL 执行计划分析
- 全表扫描 - 缺少索引的查询
- 文件排序 - 使用了 filesort 的查询
- 临时表 - 使用了临时表的查询
- 索引使用 - 索引使用效率分析
- JOIN 类型 - JOIN 优化建议
索引优化建议
- 缺失索引 - 应该添加的索引
- 冗余索引 - 可以删除的索引
- 复合索引 - 复合索引优化建议
- 索引选择性 - 索引字段选择性分析
📁 项目结构
slow-query-analyzer/
├── SKILL.md # 本文件
├── scripts/
│ ├── analyze_mysql_slow.py # MySQL 慢查询分析
│ ├── analyze_postgres_slow.py # PostgreSQL 慢查询分析
│ ├── analyze_sql.py # 单条 SQL 分析
│ ├── analyze_sql_file.py # SQL 文件批量分析
│ └── generate_report.py # 报告生成器
├── references/
│ ├── mysql_explain.md # MySQL EXPLAIN 详解
│ ├── postgres_explain.md # PostgreSQL EXPLAIN 详解
│ └── optimization_patterns.md # 常见优化模式
└── assets/
└── report_template.html # HTML 报告模板
🔧 详细用法
MySQL 慢查询分析
# 基础分析
python3 scripts/analyze_mysql_slow.py /var/lib/mysql/slow.log
# 指定时间范围
python3 scripts/analyze_mysql_slow.py slow.log --start "2024-01-01 00:00:00" --end "2024-01-31 23:59:59"
# 只显示特定数据库的查询
python3 scripts/analyze_mysql_slow.py slow.log --database myapp
# 过滤特定表
python3 scripts/analyze_mysql_slow.py slow.log --table users
# 生成不同格式的报告
python3 scripts/analyze_mysql_slow.py slow.log --format json --output report.json
python3 scripts/analyze_mysql_slow.py slow.log --format csv --output report.csv
python3 scripts/analyze_mysql_slow.py slow.log --format html --output report.html
PostgreSQL 慢查询分析
# 分析 PostgreSQL 日志(需先开启 log_min_duration_statement)
python3 scripts/analyze_postgres_slow.py /var/log/postgresql/postgresql-slow.log
# 分析特定数据库
python3 scripts/analyze_postgres_slow.py postgresql.log --database myapp
SQL 执行计划分析
# 分析单条 SQL(需要数据库连接)
python3 scripts/analyze_sql.py "SELECT u.*, COUNT(o.id) FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id" \
--db mysql \
--host localhost \
--port 3306 \
--user root \
--password secret \
--database myapp
# 从文件读取 SQL
python3 scripts/analyze_sql.py --file query.sql --db mysql --host localhost --user root --database myapp
生成优化报告
# 综合报告
python3 scripts/generate_report.py \
--mysql-slow /var/log/mysql/slow.log \
--postgres-log /var/log/postgresql/postgresql.log \
--output optimization_report.html
📋 报告内容
生成的报告包含:
概览统计
- 总查询数、慢查询数、慢查询占比
- 平均执行时间、95 分位耗时
- 最慢的查询 TOP N
查询模式分析
- 查询类型分布(SELECT/INSERT/UPDATE/DELETE)
- 表访问频率
- JOIN 类型分布
性能问题识别
- 全表扫描查询
- 文件排序查询
- 使用临时表的查询
- 大偏移量分页
优化建议
- 推荐添加的索引
- 可以优化的 SQL 写法
- 配置参数建议
💡 常见优化建议
索引优化
-- 优化前:全表扫描
SELECT * FROM users WHERE email LIKE '%test%';
-- 优化后:使用全文索引
ALTER TABLE users ADD FULLTEXT INDEX idx_email (email);
SELECT * FROM users WHERE MATCH(email) AGAINST('test');
分页优化
-- 优化前:大偏移量分页性能差
SELECT * FROM orders ORDER BY created_at DESC LIMIT 10 OFFSET 100000;
-- 优化后:使用覆盖索引+JOIN
SELECT o.* FROM orders o
JOIN (SELECT id FROM orders ORDER BY created_at DESC LIMIT 10 OFFSET 100000) tmp ON o.id = tmp.id;
JOIN 优化
-- 优化前:笛卡尔积
SELECT * FROM users u, orders o WHERE u.id = o.user_id;
-- 优化后:显式 JOIN
SELECT * FROM users u JOIN orders o ON u.id = o.user_id;
🔗 相关资源
- references/mysql_explain.md - MySQL EXPLAIN 输出详解
- references/postgres_explain.md - PostgreSQL EXPLAIN 详解
- references/optimization_patterns.md - 常见 SQL 优化模式
⚠️ 注意事项
- 生产环境谨慎 - 分析生产数据库时注意不要影响正常业务
- 权限要求 - 需要数据库的查询权限和慢查询日志读取权限
- 敏感信息 - 慢查询日志可能包含敏感数据,注意保护
- 资源消耗 - 分析大日志文件可能消耗较多内存