技能 sql-optimization-patterns
📦

sql-optimization-patterns

安全

优化 SQL 查询和数据库性能

也可从以下获取: wshobson

缓慢的数据库查询会让用户感到沮丧,并增加基础设施成本。该技能提供系统化的模式来分析查询计划、设计有效的索引,并将缓慢的 SQL 转换为高性能操作。

支持: Claude Codex Code(CC)
🥉 74 青铜
1

下载技能 ZIP

2

在 Claude 中上传

前往 设置 → 功能 → 技能 → 上传技能

3

开启并开始使用

测试它

正在使用“sql-optimization-patterns”。 在 1000 万行表上进行顺序扫描的查询

预期结果:

分析:EXPLAIN 显示顺序扫描,因为在 WHERE 子句中使用的 'created_at' 列上不存在索引。建议:CREATE INDEX idx_orders_created ON orders(created_at DESC)。预期改进:对于最近的日期范围,查询时间应从 2.3 秒降至 50 毫秒以下。

正在使用“sql-optimization-patterns”。 N+1 模式单独加载用户订单

预期结果:

问题:执行了 101 个查询(1 个用于用户 + 100 个用于订单)。解决方案:替换单个 JOIN 查询,或使用 WHERE user_id IN (...) 进行批量加载。重构方法将数据库往返减少 99%,总执行时间从 5.2 秒降至 120 毫秒。

安全审计

安全
v1 • 2/25/2026

Static analysis flagged 103 potential issues that are all false positives. The 'external_commands' findings are markdown code fence backticks in documentation, not shell execution. The 'weak cryptographic algorithm' findings reference SQL examples, not actual crypto code. The 'filesystem' finding is a PostgreSQL COPY command syntax example in documentation. This skill contains only markdown documentation with SQL optimization patterns and examples - no executable code or security risks.

2
已扫描文件
543
分析行数
0
发现项
1
审计总数
未发现安全问题
审计者: claude

质量评分

38
架构
100
可维护性
87
内容
50
社区
100
安全
91
规范符合性

你能构建什么

电商平台优化

开发团队在高峰流量期间遇到产品搜索和订单历史查询缓慢的问题。该技能帮助他们分析慢查询日志,识别频繁过滤列上缺失的索引,并重构订单加载中的 N+1 模式,将 API 响应时间从秒级降低到毫秒级。

分析仪表板性能

数据工程师需要加速实时仪表板的聚合查询,以显示销售指标。该技能指导实施物化视图进行昂贵计算、使用覆盖索引实现仅索引扫描,以及高效的 GROUP BY 模式,从而实现亚秒级的仪表板刷新率。

遗留应用现代化

高级开发人员接手了一个包含数十个慢查询的应用,这些查询导致超时错误。该技能提供系统化的方法:使用 pg_stat_statements 捕获慢查询、分析执行计划、优先考虑高影响的优化,并实施适当的索引以消除 90% 的性能问题,而无需重写应用。

试试这些提示

基本查询分析
我有一个慢 SQL 查询,运行时间超过 5 秒。这是查询和表结构:[粘贴查询和架构]。你能分析导致缓慢的原因并建议创建哪些具体索引吗?
EXPLAIN 计划解释
我对查询运行了 EXPLAIN ANALYZE,得到以下输出:[粘贴 EXPLAIN 输出]。请解���每个操作的含义,识别性能瓶颈,并推荐具体的优化方法。
索引策略设计
我有一个表,包含列 [列出列],我最常见的查询是:[列出查询]。我应该使用什么索引策略?请考虑复合索引、部分索引和覆盖索引(如适用)。
N+1 查询重构
我的应用程序在循环中执行数百个类似的查询:[描述模式或显示代码]。这导致了性能问题。帮我使用 JOIN、批量加载或其他技术来重构这个问题,以减少数据库往返次数。

最佳实践

  • 在优化之前,始终使用 EXPLAIN ANALYZE 来了解实际的查询执行情况
  • 在 WHERE、JOIN 和 ORDER BY 子句中使用的列上创建索引——但避免过度索引,因为每个索引都会降低写入操作的速度
  • 仅获取所需的列而不是 SELECT *,并尽可能在查询的早期阶段过滤数据

避免

  • 在 WHERE 子句中对索引列使用函数而没有相应的函数索引
  • 在大表上使用大 OFFSET 值进行分页,而不是基于游标的方法
  • 在应用程序循环中执行查询(N+1 模式),而不是批量加载或 JOIN

常见问题

如何确定应首先优化哪些查询?
优先考虑具有高总影响的查询:频繁但中等速度的查询通常比罕见但非常慢的查询更重要。使用 pg_stat_statements(PostgreSQL)或慢查询日志按总执行时间和调用次数查找查询。
添加更多索引是否总能提高性能?
不会。索引可以加快读取速度,但会降低 INSERT、UPDATE 和 DELETE 操作的速度。每个索引都占用存储空间并且必须进行维护。专注于支持最关键查询的索引,避免对低基数字段进行索引。
EXPLAIN 和 EXPLAIN ANALYZE 有什么区别?
EXPLAIN 根据表统计信息显示估计的查询计划。EXPLAIN ANALYZE 实际执行查询并报告真实的时间和行数,揭示估计值与现实之间的差距,这通常表明统计信息过时或参数嗅探问题。
何时应该使用复合索引而不是单独的索引?
当查询同时过滤多个列时,使用复合索引。按选择性排序列(选择性最高的在前),并考虑查询模式。(A, B) 上的复合索引支持单独过滤 A 或 A+B 的查询,但不支持单独过滤 B。
如何知道我的索引是否正在使用?
查询 pg_stat_user_indexes(PostgreSQL)以检查 idx_scan 计数。如果索引在相关查询中显示零次或极少扫描,则可能不可用,或者优化器选择了不同的计划。使用 EXPLAIN 验证特定查询的索引使用情况。
什么是基于游标的分页,何时应该使用它?
基于游标的分页使用带有最后可见值的 WHERE 子句(例如 WHERE created_at < last_cursor),而不是 OFFSET。无论页面深度如何,它都能保持一致的性能,不像 OFFSET 必须扫描并丢弃所有前面的行。