每日 AI 实战案例

AI 辅助性能调优:从慢查询到首屏 10x 提速

2026-08-24
进阶开发
30 分钟
使用工具:
ClaudePostgres MCPGitHub MCPPuppeteer MCP
AI实战性能调优Claude后端

案例摘要

接口慢、页面卡、账单贵——性能调优的瓶颈不是不懂优化,而是'不知道慢在哪'。我们用 Claude + [Postgres MCP](/mcp/2026-08-16-postgres-mcp) 抓慢查询 + [GitHub MCP](/mcp/2026-08-12-github-mcp) 读代码 + [Puppeteer MCP](/mcp/2026-08-24-puppeteer-mcp) 测前端,自动定位瓶颈、生成假设、给出分阶段优化方案,把'压测 3 天才出结论'压到 30 分钟,还顺带修了 2 个隐藏的 N+1。

案例背景

线上反馈"系统变慢了",但慢在哪不清楚。传统性能调优流程:

  • 看监控 → 延迟飙高,但不知道是 DB 还是接口
  • 查慢查询日志 → 几百条,肉眼筛
  • 翻代码 → 不知道哪段对应哪条慢 SQL
  • 压测前端 → 不知道首屏卡在哪一帧
  • 排查 3 天才出结论,优化靠经验拍脑袋

目标:用 AI 把"定位瓶颈 + 读代码 + 生成假设 + 给方案"自动化,人只做最终拍板。

工具链

工作流程

Phase 1:抓慢查询(5 分钟)

Prompt:
用 Postgres MCP 查 pg_stat_statements
按 total_exec_time 倒序取前 10 条慢查询
对每条用 EXPLAIN ANALYZE 看执行计划
标记含 Seq Scan / 高 cost / 未命中索引的

AI 自动:

  1. 查出 Top 10 慢 SQL
  2. 逐条跑执行计划
  3. 标注可疑项:
SQL #1:SELECT * FROM orders WHERE user_id=?
  执行计划:Seq Scan on orders (cost=0.00..8900 rows=1)
  问题:全表扫描,无索引
  平均耗时:1200ms
  调用频次:8000 次/天

SQL #3:SELECT * FROM order_items WHERE order_id IN (...)
  执行计划:Nested Loop + 多次单查
  问题:疑似 N+1
  平均耗时:800ms

Phase 2:代码定位(5 分钟)

Prompt:
基于慢 SQL,用 GitHub MCP 找到生成这些 SQL 的代码:
- orders WHERE user_id → 找 orderRepo.findByUser
- order_items IN → 找 orderItemRepo.findByOrderIds
看是否有循环内查库(N+1)

AI 调 GitHub MCP 读代码:

// orderService.js
async getUserOrders(userId) {
  const orders = await orderRepo.findByUser(userId);  // 1 次
  const result = [];
  for (const order of orders) {
    const items = await orderItemRepo.findByOrderId(order.id);  // ← N 次!
    result.push({ ...order, items });
  }
  return result;
}
  1. 标注:典型 N+1,订单多 N 次查库。

Phase 3:前端瓶颈(5 分钟)

Prompt:
用 Puppeteer MCP 打开 /orders 页
采集 Performance trace
定位首屏最大阻塞任务(LCP / 长任务)
截图 + 给出关键指标

AI 自动:

  1. 导航 + 采集 trace
  2. 定位:
LCP:3.8s(目标 < 2.5s)
阻塞:/api/orders 接口 2.1s(后端慢,前端背锅)
长任务:一个大 bundle 的 JS 解析 600ms

Phase 4:根因推演(5 分钟)

Prompt:
基于 DB + 代码 + 前端数据,推演根因:
1. 首屏慢的直接原因
2. 慢在哪一层(DB/接口/前端)
3. 为什么之前没暴露
4. 给 3 个验证假设

AI 输出:

直接原因:
  /orders 接口 2.1s → 首屏 LCP 3.8s
  接口慢根因:N+1 查询(800ms)+ orders 全表扫描(1.2s)

慢在哪一层:
  DB 层(2 条慢 SQL)→ 接口层(串行 N+1)→ 前端只是等接口

为什么没暴露:
  1. 订单量小之前 N+1 不明显
  2. orders 表行数少时 Seq Scan 不慢
  3. 没有慢 SQL 告警阈值

验证假设:
  H1:加索引后 orders 查询 < 10ms
    → 验证:建索引后 EXPLAIN ANALYZE
  H2:N+1 改 JOIN 后接口 < 300ms
    → 验证:改写代码压测
  H3:前端 bundle 拆分后长任务消失
    → 验证:拆包后重测 trace

Phase 5:分阶段优化方案(5 分钟)

Prompt:
给出修复方案,分紧急止血、短期、长期

AI 输出:

紧急止血(今天):
  1. orders.user_id 加索引(DB 层,立竿见影)
  2. N+1 改批量 IN 查询(一次查完所有 items)

短期(本周):
  1. order_items.order_id 加索引
  2. 接口加缓存(订单列表 Redis 5 分钟)
  3. 慢 SQL 告警阈值接入监控

长期(本月):
  1. 前端 bundle 拆分,按路由懒加载
  2. 订单列表分页 + 字段裁剪(不 SELECT *)
  3. 建立性能基线,每次发版回归

Phase 6:工单与跟踪(5 分钟)

配合 Linear/GitHub:

你:把优化任务建工单 + 跟踪

AI:
  1. 建 3 个工单(止血/短期/长期)
  2. 负责人 = 各层 owner
  3. 每个工单附:根因 + 验证假设 + 预期指标
  4. 接入监控,达标自动关单

关键 Prompt 复盘

Prompt 1:慢查询排序明确

按 total_exec_time 倒序取前 10
标记含 Seq Scan / 高 cost / 未命中索引的

为什么有效:限定排序维度和筛选条件,避免 AI 把几百条全列出。标记可疑项聚焦最值得优化的。

Prompt 2:N+1 探测

看是否有循环内查库(N+1)

为什么有效:明确点名 N+1 这个常见反模式,AI 会重点看 for 循环里的 await 查库。

Prompt 3:分层根因

慢在哪一层(DB/接口/前端)

为什么有效:强制分层定位,避免 AI 只说"慢"不说是哪层,后续优化才能对症。

Prompt 4:分阶段方案

紧急止血 / 短期 / 长期

为什么有效:区分立竿见影和长期改造,止血先上,根治排期,不混为一谈。

踩过的坑

坑 1:只看 DB 忽略前端

AI 只盯慢 SQL → 修完接口还是慢
  → 真因是前端 bundle 3MB
  → 漏了一层

解决:用 Puppeteer MCP 测前端,分层看,不止看 DB。

坑 2:EXPLAIN 读不懂

AI 给了执行计划但没解读
  → Seq Scan 是啥?cost 高代表啥?

解决:Prompt 要求"标记 Seq Scan / 高 cost / 未命中索引并解释含义",逼 AI 解读而非罗列。

坑 3:优化反而劣化

加索引后查询快了
  → 但写入变慢(索引维护成本)
  → 高写入表乱加索引适得其反

解决:方案要评估读写比,Postgres MCP 查表的读写比例再决定。

坑 4:N+1 修了又引入新的

批量查改完了 → 但又在新功能里写循环查库
  → 没有回归防护

解决:加 N+1 检测测试,配合 Prompt 回归测试 的思路——把"无 N+1"做成持续守住的基线。

坑 5:无基线无法判断好坏

"慢"是主观的 → 没基线 → 改完不知道有没有效

解决:建立性能基线(关键接口 P95/首屏 LCP),每次发版回归,达标才上线。

效率对比

环节传统AI 辅助提速
慢查询筛查60 分钟5 分钟12x
代码定位40 分钟5 分钟8x
前端分析30 分钟5 分钟6x
根因推演50 分钟5 分钟10x
方案输出40 分钟5 分钟8x
工单跟踪20 分钟5 分钟4x
合计约 4 小时30 分钟8x

准确率对比

维度传统(人工)AI 辅助
慢查询筛选70%(累)90%(机器不累)
N+1 识别60%(藏得深)85%(重点查循环查库)
分层定位中(容易盯一层)高(强制 DB/接口/前端)
方案可行性依赖经验平衡(读写比+分阶段)

AI 在 N+1 识别和分层定位上优势明显——人容易只盯自己熟的那层。

哪些环节 AI 真省时间

  • ✅ 慢查询筛查:几百条秒级排序标记
  • ✅ N+1 探测:重点查循环内查库
  • ✅ 分层定位:强制 DB/接口/前端都看

哪些环节还得靠人

  • ⚠️ 索引决策:读写比、表大小权衡靠人判断
  • ⚠️ 架构级改造:分库分表、缓存策略靠人拍板
  • ⚠️ 发版风险:改完要不要灰度、回滚靠人决策
  • ⚠️ 业务优先级:先优化哪个接口,靠业务价值判断

质量保障

上线前必查:

  • AI 读的是真实执行计划与代码(MCP 读的,非编造)
  • 分层定位完整(DB + 接口 + 前端)
  • 至少 2 个验证假设
  • 方案分紧急/短期/长期
  • 索引决策评估了读写比
  • 建立性能基线,发版回归

小结

这个案例最大的启示:性能调优的瓶颈不是"懂优化技巧",而是"信息分散在哪一层都不清楚"。AI 把慢查询、代码、前端 trace 三处信息拉到一处分层定位,人只做索引决策和架构拍板。

下次遇到"系统变慢了"别凭感觉——用 Postgres MCP 抓慢 SQL、GitHub MCP 查 N+1、Puppeteer MCP 测首屏、Claude 分层推演根因,30 分钟出"DB/接口/前端各慢在哪、分阶段怎么修"的完整调优链,你会发现真正需要人脑的,可能就是那个"这表写入多到底加不加索引"的权衡。

相关推荐

查看更多 →
案例开发

AI 监控告警智能分诊:日均 3000 条告警从 25 分钟降到 3 分钟响应

公司的微服务架构每天产生约 3000 条告警(Prometheus + Grafana),值班 SRE 平均响应时间 25 分钟,其中 70% 是误报或低优先级。我们用 Claude 做告警分类和根因推断 + 日志分析 MCP 做自动日志关联 + GitHub MCP 做自动创建 Issue + Slack MCP 做告警通知路由,构建了端到端的告警分诊流水线。误报过滤准确率 94%,真正需要人工处理的告警平均响应时间降到 3 分钟,值班人员工作量减少 68%。本文复盘工具分工、分诊 Prompt 模板、根因推断准确率数据和踩过的坑。

2026-09-02
#AI实战#告警分诊
案例开发

AI 辅助 Bug 定位:从日志到根因 10 分钟

生产 bug 像侦探破案,但日志千万行、调用链几十层、时间紧压力大。我们用 Claude + [Filesystem MCP](/mcp/2026-08-14-filesystem-mcp) 读日志 + [GitHub MCP](/mcp/2026-08-12-github-mcp) 查代码,自动过滤噪音、提取关键堆栈、定位可疑文件、生成假设与验证方案,把 2 小时的排查压到 10 分钟,准确率还更高。

2026-08-19
#AI实战#Bug定位
案例开发

AI 辅助代码审查:从 200 个 PR 里 10 分钟筛出 5 个高风险

代码审查是保障质量的关键,但 PR 太多人审不过来。我们用 Claude + [模板复用](/prompts/2026-08-16-prompt-reuse) 的参数化审查模板,对 200 个 PR 做批量初筛,自动打风险分、标高风险项、生成人工复审清单。把 8 小时的初筛压到 10 分钟,让人把精力放在真正需要人脑的高风险 PR 上。

2026-08-16
#AI实战#代码审查
案例商业

AI 辅助竞品分析:3 天的工作量压到 2 小时

竞品分析是战略决策的基础,但手动搜集 5 家竞品、读 50 篇资料、做对比表、写报告要 3 天。我们用 Claude + [Google Drive MCP](/mcp/2026-08-18-google-drive-mcp) + [Notion MCP](/mcp/2026-08-17-notion-mcp) 自动搜集、结构化提取、生成对比矩阵与战略建议,把 3 天压到 2 小时,还挖出 3 个手动分析漏掉的机会点。

2026-08-18
#AI实战#竞品分析