mcpField
P
performance-optimization

performance-optimization

github.com/thibautbaissac开发67258 次安装22 周前更新
代码仓库

关于 performance-optimization

面向 Rails 8 开发者的性能优化指南,涵盖数据库查询、内存管理和响应时间分析。通过检测、分析、修复和验证的流程提供优化模式。

主要功能

  1. 01检测并预防 N+1 查询
  2. 02优化查询与数据库索引
  3. 03分析查询计划和慢查询
  4. 04分析内存使用并进行性能分析
  5. 05使用批处理处理大型数据集

适用场景

  1. 01排查页面请求中的 N+1 查询
  2. 02优化大型数据集的处理
  3. 03分析慢查询与数据库索引需求
  4. 04定位应用的内存问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/thibautbaissac/rails_ai_agents --skill performance-optimization

安装后在 Claude Code 中输入/performance-optimization确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
memory-and-profiling.md
n-plus-one.md
query-optimization.md

详细介绍

Rails 8 性能优化

概述

性能优化重点包括:

  • 检测和防止 N+1 查询
  • 查询优化
  • 内存管理
  • 缩短响应时间
  • 数据库索引

快速入门

# Gemfile
group :development, :test do
  gem 'bullet'           # N+1 detection
  gem 'rack-mini-profiler' # Request profiling
  gem 'memory_profiler'  # Memory analysis
end

检测和防止 N+1 查询

N+1 查询是指代码先加载一个集合,然后为每条关联记录单独执行一次查询。Bullet gem 可自动检测此类问题。使用 includes、preload 或 eager_load 进行预加载即可解决。

预加载决策表
方法适用场景
includes大多数情况(由 Rails 选择最佳策略)
preload强制使用单独查询、处理大型数据集
eager_load需要按关联进行筛选,或需要单次查询
joins只需筛选,无需关联数据

关键模式:Bullet 配置、预加载方法、作用域预加载、计数器缓存,以及使用查询数量断言编写 N+1 测试。

所有代码示例和模式请参阅 references/n-plus-one.md。

查询优化

通过只选择所需列、对大型数据集使用批处理,以及选择高效的存在性检查方式来优化查询。

关键模式
模式不推荐推荐
列选择User.all.map(&:name)User.pluck(:name)
大量迭代Event.all.each { ... }Event.find_each { ... }
存在性检查.any? / .present?.exists?
集合大小.length(加载全部数据).size(智能处理)
数据库索引

为外键、WHERE/ORDER BY/JOIN 子句中的列以及唯一约束添加索引。多列查询使用复合索引。对经过筛选的子集使用部分索引。

查询分析

使用 Event.where(...).explain(:analyze) 检查查询计划。通过 ActiveSupport::Notifications 设置慢查询日志,以捕获超过阈值的查询。

所有代码示例和模式请参阅 references/query-optimization.md。

内存管理与性能分析

使用 memory_profiler 检测内存问题。优先使用 pluck,而非加载完整的 AR 对象;使用 find_each 进行流式处理;批量操作使用 update_all / in_batches。

Rack Mini Profiler

在开发环境中提供逐请求性能分析。显示查询数量、耗时和火焰图(需使用 stackprof gem)。通过性能分析器徽标或 ?pp=flamegraph 访问。

所有代码示例和模式请参阅 references/memory-and-profiling.md。

快速修复参考

问题解决方案
belongs_to 上的 N+1includes(:association)
has_many 上的 N+1includes(:association)
COUNT 速度慢添加 counter_cache
加载所有列使用 select 或 pluck
大型数据集迭代使用 find_each
外键缺少索引为 *_id 列添加索引
WHERE 子句速度慢为筛选列添加索引
加载未使用的关联从 includes 中移除

性能检查清单

  • 在开发/测试环境中启用 Bullet
  • 关键路径中没有 N+1 查询
  • 外键已添加索引
  • 为频繁计数的字段添加计数器缓存
  • 在控制器中进行预加载
  • 对大型数据集进行批处理
  • 分析速度慢的端点查询

工作流

  1. 检测 —— 启用 Bullet、运行测试,并检查 Rack Mini Profiler
  2. 分析 —— 使用 explain(:analyze)、检查慢查询日志,并分析内存
  3. 修复 —— 应用参考文件中的相应模式
  4. 验证 —— 重新运行测试、确认查询数量,并检查性能分析器

参考文件

评论

支持 Markdown