SKILL.md
SQL 调优检查闸门#
对慢查询做定序排查并给出可执行改写。纯指令技能:不带脚本、不联网、不写任何文件,产出为分析结论与改写文本。
排查顺序(逐级收敛,不跳步)#
1 读执行计划(EXPLAIN / EXPLAIN ANALYZE)关键指标#
- 访问类型:全表扫描还是索引扫描,命中到哪一层;
- 预估行数与实际行数偏差大 → 统计信息过期或优化器误判;
- Extra 中的排序、临时表、回表提示。
2 索引层#
- WHERE、JOIN、ORDER BY 涉及的列有没有可用索引;
- 联合索引顺序是否符合最左前缀;选择性差的列是否应放后面;
- 是否可用覆盖索引消除回表。
3 写法层(反模式逐条对照)#
- 对列做函数或运算导致索引失效;
- 隐式类型转换(字符串列传数字);
- SELECT * 拖宽回表;深分页 OFFSET;大 IN 列表;
- 子查询被逐行执行时改写为 JOIN。
4 数据量与锁#
- 单表行数量级;等待锁事件;批量写是否应分批。
输出格式#
- 定位结论:一句话指出主因,附执行计划证据;
- 改写方案:给出改写后的完整 SQL,逐条说明每处改动针对哪个指标;
- 索引方案:给出建索引语句,附预期收益与代价(写放大、空间);
- 验证闭环:改前与改后各跑一次 EXPLAIN 与耗时,记录两个数字——没有对比数字不宣称「已优化」。
红线#
- 不在没有执行计划的情况下凭经验下结论;
- 不为「可能的需求」提前建索引;
- 改写不得改变业务语义:改动后列出语义对比,逐项确认等价。
用途与依赖
作者没写,这些是平台读文件后整理的,以文件为准。
使用示例
请求:这条订单查询现在要 8 秒,我把 EXPLAIN 结果贴给你,帮我看看哪里有问题、怎么改。
预期
先向你确认表结构与现有索引定义,然后从执行计划入手:指出访问类型是全表扫描还是索引扫描,比对预估行数与实际行数是否偏差过大(可能统计信息过期),检查 Extra 中的排序、临时表和回表提示。接着按索引层、写法层、数据量与锁的顺序逐级收敛,给出主因的一句话定位结论并附上执行计划中的证据。之后输出改写后的完整 SQL,逐条说明每处改动对应哪个指标;给出建索引语句并注明预期收益,以及写放大和空间方面的代价。最后列出语义等价对比逐项确认业务含义不变,并给出改前改后各跑一次 EXPLAIN 与耗时的验证方式——没有两个对比数字就不宣称已优化。若执行计划不完整,会先请你补齐,不会凭经验下结论。
- 适用场景
- 线上某条查询突然变慢,需要定位原因并给出改写
- 拿到一条报表 SQL 和它的 EXPLAIN 输出,想确认是否走索引
- 深分页、大 IN、子查询等写法需要按反模式逐条核对
- 想为慢查询设计联合索引或覆盖索引,并评估写放大与空间代价
- 改写 SQL 后要验证是否真的变快,需要改前改后的对比方法
- 判断慢查询是索引问题、写法问题还是数据量与锁的问题
- 输入
- 慢查询的完整 SQL 语句
- EXPLAIN 或 EXPLAIN ANALYZE 的输出
- 涉及表的表结构与现有索引定义
- 表的数据量级
- 当前耗时,以及改前改后的对比数字
- 查询的业务语义与结果要求(用于确认改写等价)
- 是否观察到锁等待或并发写入情况
- 输出
- 一句话定位结论,并附执行计划中的证据
- 改写后的完整 SQL,并逐条说明每处改动针对哪个指标
- 建索引语句,以及预期收益和写放大、空间代价
- 改前改后 EXPLAIN 与耗时的验证闭环方法
- 改动前后的业务语义等价对比清单
- 运行环境
- 未说明
- 依赖
- 无

