关于 performance-optimization
面向 Rails 8 开发者的性能优化指南,涵盖数据库查询、内存管理和响应时间分析。通过检测、分析、修复和验证的流程提供优化模式。
主要功能
- 01检测并预防 N+1 查询
- 02优化查询与数据库索引
- 03分析查询计划和慢查询
- 04分析内存使用并进行性能分析
- 05使用批处理处理大型数据集
适用场景
- 01排查页面请求中的 N+1 查询
- 02优化大型数据集的处理
- 03分析慢查询与数据库索引需求
- 04定位应用的内存问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ thibautbaissac/ rails_ai_agents --skill performance-optimization安装后在 Claude Code 中输入/performance-optimization确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/memory-and-profiling.mdn-plus-one.mdquery-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+1 | includes(:association) |
| has_many 上的 N+1 | includes(:association) |
| COUNT 速度慢 | 添加 counter_cache |
| 加载所有列 | 使用 select 或 pluck |
| 大型数据集迭代 | 使用 find_each |
| 外键缺少索引 | 为 *_id 列添加索引 |
| WHERE 子句速度慢 | 为筛选列添加索引 |
| 加载未使用的关联 | 从 includes 中移除 |
性能检查清单
- 在开发/测试环境中启用 Bullet
- 关键路径中没有 N+1 查询
- 外键已添加索引
- 为频繁计数的字段添加计数器缓存
- 在控制器中进行预加载
- 对大型数据集进行批处理
- 分析速度慢的端点查询
工作流
- 检测 —— 启用 Bullet、运行测试,并检查 Rack Mini Profiler
- 分析 —— 使用
explain(:analyze)、检查慢查询日志,并分析内存 - 修复 —— 应用参考文件中的相应模式
- 验证 —— 重新运行测试、确认查询数量,并检查性能分析器
参考文件
- references/n-plus-one.md -- N+1 检测、预加载方法、Bullet 配置、计数缓存、测试模式
- references/query-optimization.md -- 列选择、批处理、索引策略、EXPLAIN 分析、慢查询日志记录
- references/memory-and-profiling.md -- 内存分析器的使用、内存高效模式、Rack Mini Profiler 设置、部署检查清单