SQL 性能优化
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_f5ec5127/sql-performance-optimizer。
技能介绍
先谈问题:慢查询不能靠猜
一条 SQL 从几毫秒变成几秒,常见原因是不可 SARG 化的谓词让索引失效、隐式转换让整列失去可搜索性、SELECT * 拉宽读取、JOIN 条件缺失造成结果膨胀、相关子查询逐行重复计算、排序与窗口函数消耗 CPU、OFFSET 分页越翻越慢。更隐蔽的是参数敏感型执行计划:换个参数值,优化器就选了完全不同的路径。
没有 EXPLAIN 输出与实测耗时,这些瓶颈看起来都很像。凭经验“重写一下”,常悄悄改变结果集语义,或套用别的方言语法。
技能如何工作
证据优先,语义不变。 先确认目标数据库类型与版本,不在方言间静默转换;缺少表结构、数据规模或症状时先问最有价值的问题。
提供五个范围:执行性能、索引与数据设计、业务逻辑、兼容性与正确性、全面审查,仅在用户明确要求时自行推断。针对执行性能与索引,先要 EXPLAIN 输出、耗时、读取行数、参数值、表行数与索引定义。
分析定位瓶颈:不可搜索谓词、隐式转换、过宽读取、连接膨胀、重复计算、高成本排序聚合、低效分页、参数敏感计划。建议分四类:SQL 重写(最小改动并说明语义保证方式)、索引或数据调整(给出键列与包含列,说明写入与存储成本)、业务方案(减少请求的计算量本身)、平台或版本方案(含兼容旧版本写法)。
输出固定五部分:范围与假设、问题发现(问题 / 影响 / 置信度 / 原因)、改进建议(按收益与成本排序)、重写后的 SQL(语义不明时只给片段)、验证方法(耗时、逻辑与物理读取、CPU、行数、计划形态、并发影响,代表性参数重跑)。
适用边界
- 诊断优先,不是改写工具。 不把“语法更短”当作“执行更快”,无证据时不断言某计划一定更快。
- 不默认最后手段。 查询提示、强制计划、
NOLOCK、盲目加索引仅在受约束时兜底,并说明风险。 - 保持参数化查询。 标记动态 SQL 与注入风险,但不在性能优化中混入安全整改。
- 生产变更要有回滚。 涉及索引、执行计划、隔离级别或表结构时,同时说明验证与回滚方式。
- 不跨方言猜测。 只针对已知数据库给替代写法;
JOIN、DISTINCT、NOT IN、NULL、日期边界与分页的重写,先标记结果变化风险。
使用场景
- 线上查询延迟从 20ms 升到 3s,手上有 SQL、数据库类型和 EXPLAIN 输出,需要定位瓶颈并给出最小改动。
- 分页报表越翻越慢,需要判断是 OFFSET 分页、索引缺失还是排序代价,并给出不改业务语义的方案。
- 新索引上线前,需要评估键列、包含列、写入与存储成本,并准备回滚和前后对比验证。
- 同一 SQL 换个参数执行计划就变,需要收集参数值和读取行数,判断是否为参数敏感型计划并给缓解方案。
适合人员
- 后端工程师:接口响应变慢,需要按证据优化 SQL,并保证结果和参数化查询不变。
- DBA:上线索引或调整隔离级别前,需要评估影响、写入成本和回滚验证方式。
- 数据平台工程师:报表查询读取过宽、聚合昂贵,需要从业务侧减少计算量而不破坏结果。
- 资深开发:跨数据库方言迁移 SQL 时,需要确认版本语法支持、NULL 语义和隐式转换风险。