Agent 技能库 / 数据库

sql-optimizer

读 EXPLAIN 定位瓶颈,给索引列序与 SQL 改写;附带把 EXPLAIN 转风险提示的脚本。

触发条件(frontmatter.description)

分析慢 SQL 与 EXPLAIN 输出,给出索引建议和改写方案。当用户提供慢查询、执行计划、或说"这条 SQL 很慢""为什么没走索引"时使用。不用于建库建表设计评审。

目录结构

sql-optimizer/
├── SKILL.md
└── scripts/check_explain.py

安装方式

  • Claude Code把技能目录复制到以下位置,重启会话后自动可用~/.claude/skills/<技能名>/项目级可放 <项目>/.claude/skills/
  • Claude.ai / Desktop下载 .zip 后在 设置 → Capabilities → Skills 上传需要开启 Skills 功能
  • Hermes Agent放到技能目录,Hermes 启动时自动加载~/.hermes/skills/<技能名>/
  • 其它 Agent任何支持 SKILL.md 约定(YAML frontmatter + 步骤 + 脚本)的框架都可直接使用本质是一个带说明文档的脚本目录

下载的 zip 解压后是 sql-optimizer/ 目录,直接整个放进去即可,不用改文件名。

技能包内容

---
name: sql-optimizer
description: 分析慢 SQL 与 EXPLAIN 输出,给出索引建议和改写方案。当用户提供慢查询、执行计划、或说"这条 SQL 很慢""为什么没走索引"时使用。不用于建库建表设计评审。
---

# SQL 优化

## 什么时候用

- 用户提供慢 SQL + 表结构
- 用户贴了 `EXPLAIN` 结果,问为什么慢
- 需要加索引但不确定列顺序

**不要用**:从零设计表结构、迁移方案评估。

## 步骤

1. **收集三样东西**:表结构(含现有索引)、SQL、EXPLAIN 输出。缺哪个先问,不要凭猜
2. **定位瓶颈**:看 `type`(ALL = 全表扫)、`rows`(扫描行数)、`Extra`(Using filesort / Using temporary)
3. **判断根因**:函数包裹索引列 / 隐式类型转换 / 最左前缀不满足 / 回表过多 / 排序无法用索引
4. **给方案**,按优先级:
   - 改写 SQL(去掉函数、拆子查询、改分页方式)
   - 加/改索引(说清联合索引的列顺序与理由)
   - 覆盖索引(消除回表)
5. **验证方式**:给出改后应看到的 EXPLAIN 特征

## 输出格式

```
## 瓶颈
(type / rows / Extra 里哪一项暴露了问题)

## 根因
(一条,具体到条件)

## 方案
1. 索引:ALTER TABLE ... ADD INDEX ...(说明为什么这个列序)
2. 改写:<前后对比代码>

## 预期效果
改后 EXPLAIN 应为:type=range, rows≈N, Extra 无 filesort
```

## 验证

- 索引建议必须说明列顺序的理由(区分度、最左前缀、覆盖查询)
- 改写前后必须可对比
- 标注是否需要 `SELECT` 先验证再执行写操作

## 陷阱

- 不知道数据库类型/版本就给建议(MySQL 5.7 与 8.0 优化器行为不同)
- 建议「加索引」但不说列顺序,等于没说
- 忽略数据分布:区分度低的列放前面毫无意义

SKILL.md 说明(Agent 读到后照此执行)

# SQL 优化

## 什么时候用

- 用户提供慢 SQL + 表结构
- 用户贴了 `EXPLAIN` 结果,问为什么慢
- 需要加索引但不确定列顺序

**不要用**:从零设计表结构、迁移方案评估。

## 步骤

1. **收集三样东西**:表结构(含现有索引)、SQL、EXPLAIN 输出。缺哪个先问,不要凭猜
2. **定位瓶颈**:看 `type`(ALL = 全表扫)、`rows`(扫描行数)、`Extra`(Using filesort / Using temporary)
3. **判断根因**:函数包裹索引列 / 隐式类型转换 / 最左前缀不满足 / 回表过多 / 排序无法用索引
4. **给方案**,按优先级:
   - 改写 SQL(去掉函数、拆子查询、改分页方式)
   - 加/改索引(说清联合索引的列顺序与理由)
   - 覆盖索引(消除回表)
5. **验证方式**:给出改后应看到的 EXPLAIN 特征

## 输出格式

```
## 瓶颈
(type / rows / Extra 里哪一项暴露了问题)

## 根因
(一条,具体到条件)

## 方案
1. 索引:ALTER TABLE ... ADD INDEX ...(说明为什么这个列序)
2. 改写:<前后对比代码>

## 预期效果
改后 EXPLAIN 应为:type=range, rows≈N, Extra 无 filesort
```

## 验证

- 索引建议必须说明列顺序的理由(区分度、最左前缀、覆盖查询)
- 改写前后必须可对比
- 标注是否需要 `SELECT` 先验证再执行写操作

## 陷阱

- 不知道数据库类型/版本就给建议(MySQL 5.7 与 8.0 优化器行为不同)
- 建议「加索引」但不说列顺序,等于没说
- 忽略数据分布:区分度低的列放前面毫无意义

← 返回技能库