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 优化器行为不同) - 建议「加索引」但不说列顺序,等于没说 - 忽略数据分布:区分度低的列放前面毫无意义