Install
openclaw skills install mysql-slow-query-analyzer-kay专业解析 MySQL EXPLAIN 与慢查询日志,定位性能瓶颈,提供索引与SQL重写优化建议,提高查询性能效率。
openclaw skills install mysql-slow-query-analyzer-kay你是 MySQL Performance Expert,专门帮助开发者定位和优化 MySQL 慢查询。
开发阶段发现某个接口响应慢,直接把 SQL 发给技能分析
→ 立即知道走没走索引、成本多少、需要什么优化
DBA 或同事 review SQL,粘贴 EXPLAIN 输出
→ 自动生成优化建议(索引/重写/配置调整)
从生产环境拉取 slow_query_log,粘贴给技能
→ 自动识别最慢的 TOP N 查询,逐一给出优化方案
数据库 CPU/IO 突然飙升,怀疑有烂 SQL
→ 通过 slow query log 快速定位元凶
输入: EXPLAIN FORMAT=JSON SELECT ...
输出: 结构化分析报告
- 查询成本(query_cost)
- 扫描行数(rows_examined)
- 索引使用情况(index_used)
- 连接类型(join_type)
- 性能评分(0-100)
- 问题识别 + 优化建议
输入: # Time: 2024-01-01T10:00:00.123456Z
# Query_time: 5.234193 Lock_time: 0.000089 Rows_sent: 100 Rows_examined: 500000
SELECT * FROM orders WHERE status = 1;
输出:
- 查询耗时分级(WARNING / CRITICAL)
- 扫描行数 vs 返回行数 比值
- 每行扫描成本
- 优化建议
分析维度:
- WHERE 子句中的列 → 建议建立索引
- JOIN 连接的列 → 建议建立索引
- ORDER BY 列 → 建议建立索引
- GROUP BY 列 → 建议建立索引
- 联合索引字段顺序建议
输出格式:
- 建议创建的索引(DROP / ADD)
- 覆盖索引建议(Using index)
- 前缀索引建议(长字符串列)
支持的场景:
- SELECT * → 指定列名
- OR → UNION 重写
- NOT IN → NOT EXISTS
- 子查询 → JOIN 重写
- DISTINCT 优化
- LIMIT offset 大 → 游标分页
- 隐式类型转换修复
输出指标:
- 查询成本评分(0-100,>70 需优化)
- 扫描效率(rows_examined / rows_sent)
- 每秒扫描行数估算
- 索引命中率
- 全表扫描检测
📊 MySQL EXPLAIN 分析报告
🎯 查询成本: 12450.35
📦 扫描行数: 50,000
📨 返回行数: 100
⚡ 扫描效率: 500:1 (较差,每500行才返回1行)
🔍 执行计划:
- 类型: ALL (全表扫描) ⚠️
- 索引: NULL
- 键: NULL
- 行长度: 256
- Extra: Using filesort ⚠️
⚠️ 性能问题:
- 🔴 全表扫描,50,000行数据全部扫描
- 🔴 Using filesort,ORDER BY 未走索引
- 🟡 隐式类型转换:status = '1' (字符串 vs 数字)
💡 优化建议:
1. 🔧 在 orders.status 列建立索引
2. 🔧 在 orders(created_at, status) 建立联合索引消除 filesort
3. 🔧 将 status = '1' 改为 status = 1 避免类型转换
4. 🔧 用 EXPLAIN FORMAT=JSON 查看真实成本
🐌 慢查询分析
⏱️ 查询时间: 5.23s (🔴 CRITICAL > 5s)
🔒 锁等待: 0.09ms
📊 扫描行数: 500,000
📨 返回行数: 100
📈 效率比: 5000:1 (极差)
💡 优化建议:
1. 🔧 orders.status 列缺少索引 → 添加 INDEX idx_status (status)
2. 🔧 查询返回100行却扫描50万行 → 检查是否有合适索引
3. 🔧 考虑在 status + created_at 上建立联合索引
from mysql_slow_query_analyzer import (
parse_explain_json,
parse_explain_text,
parse_slow_query_log,
generate_index_suggestions,
generate_rewrite_suggestions,
analyze_slow_query,
)
# 解析 EXPLAIN JSON
explain_json = '{"query_block": {"select_id": 1, "cost_info": {"query_cost": "12450.35"}, ...}}'
report = parse_explain_json(explain_json)
print(report)
# 解析慢查询日志
log_entry = """
# Time: 2024-01-01T10:00:00.123456Z
# Query_time: 5.234193 Lock_time: 0.000089 Rows_sent: 100 Rows_examined: 500000
SELECT * FROM orders WHERE status = 1;
"""
report = parse_slow_query_log(log_entry)
print(report)
# 生成索引建议
sql = "SELECT * FROM orders WHERE status = 1 AND created_at > '2024-01-01'"
suggestions = generate_index_suggestions(sql)
print(suggestions)
# 完整分析
report = analyze_slow_query(sql)
print(report)
# 解析 EXPLAIN JSON
python mysql_slow_query_analyzer.py explain-json '<JSON>'
# 解析 EXPLAIN TEXT
python mysql_slow_query_analyzer.py explain-text '<TEXT>'
# 分析慢查询日志
python mysql_slow_query_analyzer.py slowlog '<LOG_ENTRY>'
# 生成索引建议
python mysql_slow_query_analyzer.py index-advice '<SQL>'
# SQL 重写建议
python mysql_slow_query_analyzer.py rewrite '<SQL>'
# 完整分析(输入 SQL,自动 EXPLAIN 解析 + 建议)
python mysql_slow_query_analyzer.py analyze '<SQL>'