在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

提高 Ruby on Rails 性能的几种技巧

  • 2010-08-18
  • 本文字数:1332 字

    阅读完需:约 4 分钟

Ruby on Rails 以其高度的易用性和灵活性著称,不过这些优点的背后还存在着性能的隐患。最近,资深 Ruby on Rails 作家 David Berube 提供了几个 Ruby on Rails 性能优化的技巧,对相关开发人员具有一定的借鉴意义。

David Berube 在文章中首先分析了 Rails 应用运行缓慢的原因:

  • Rails 总是会做一些假设为您加速开发。通常,这种假设是正确而有帮助的。不过,它们并不总能有益于性能,并且还会导致资源使用的效率低下——尤其是数据库资源。
  • 另一个显著的挑战是 N+1 问题…这会导致很多小查询的执行,而不是一个单一的大查询。例如,ActiveRecord 无从知道一组父记录中的哪一个会请求一个子记录,所以它会为每个父记录生成一个子记录查询。由于每查询的负荷,这种行为将导致明显的性能问题。
  • 由于 ActiveRecord 能够让如此众多的任务变得轻而易举,Rails 开发人员常常会形成 “SQL 不怎样” 的一种态度,即便在更适合使用 SQL 的时候,也会避免 SQL。创建和处理数量巨大的 ActiveRecord 对象的速度会非常缓慢,所以在有些情况下,直接编写一个无需实例化任何对象的 SQL 查询会更快些。

对于如何检测性能问题, David Berube 提供了一些建议:

  • 最好的工具之一是 Rails 开发日志,它通常位于每个开发机器上的 log/development.log 文件内。它具有各种综合指标:响应请求所花费的总时间、花费在数据库内的时间所占的百分比、生成视图所花时间的百分比等。
  • 在生产期间,通过查看 mysql_slow_log 可以找到很多有价值的信息。
  • 其中一个最强大也是最为有用的工具是 query_reviewer 插件。这个插件可显示在页面上有多少查询在执行以及页面生成需要多长时间。并且它还会自动分析 ActiveRecord 生成的 SQL 代码以便发现潜在问题。例如,它能找到不使用 MySQL 索引的查询,所以如果您忘记了索引一个重要的列并由此造成了性能问题,那么您将能很容易地找到这个列。此插件在一个弹出的
    (只在开发模式下可见)中显示了所有这类信息。

针对 N+1 查询问题,David Berube 举了一个未优化的代码示例:

<%@posts = Post.all(@posts).each do |p|%>

<%=p.category.name%>

<%=p.body%>

<%end%>

David Berube 指出,上述代码生成了一个查询外加 @posts 内的每行一个查询。由于每查询的负荷,这可能会成为一个很大的挑战。罪魁祸首是对 p.category.name 的调用。这个调用只应用于该特定的 post 对象,而不是整个 @posts 数组。这种情况通过使用立即加载可以修复。立即加载(Eager loading)意味着 Rails 将自动执行所需的查询来加载任何特定子对象的对象。Rails 将使用一个 JOIN SQL 语句或一个执行多个查询的策略。不过,假设指定了将要使用的所有子对象,那么将永远不会导致 N+1 的情形,在 N+1 情形下,一个循环的每个迭代都会生成额外的一个查询。优化后的代码如下:

<%@posts = Post.find(:all, :include=>[:category] @posts.each do |p|%>

<%=p.category.name%>

<%=p.body%>

<%end%>

比较复杂的情况包括嵌套的立即加载间接的立即加载

除了解决 N+1 问题之外,David Berube 还提供了其他一些优化建议:

InfoQ 将继续关注 Ruby on Rails 的发展,读者朋友可以通过 InfoQ 中文站 Ruby 社区了解更多信息。

2010-08-18 23:563866
用户头像

发布了 501 篇内容, 共 286.3 次阅读, 收获喜欢 64 次。

关注

评论

发布
暂无评论
发现更多内容

三级等保测评流程五步走

等保测评

黑龙江密码测评的实施流程

等保测评

黑龙江等保测评流程的注意事项

等保测评

MyEMS 4G 网关:打造高效协同的能源管理中枢

开源能源管理系统

开源 能源管理系统 4G网关

智能网联 + AI:EMQX 5.10.0 大模型集成功能介绍

EMQ映云科技

人工智能 mqtt

京东携手HarmonyOS SDK首发家电AR高精摆放功能

京东科技开发者

新能源锂电池制造执行系统(MES)全面解决方案

万界星空科技

mes 新能源行业 制造业工厂 新能源电池 锂电池mes

Web3支付App的技术框架

北京木奇移动技术有限公司

区块链开发 软件外包公司 web3开发

一文说明白Context Engineering:AI智能体的动态语境构建术

蔡超

AI Agent Agentic AI Context Engineering

20250713动词ing,ed尾字母双写规则

codists

Python

KWDB 时序引擎核心能力——存储与读写

KaiwuDB

数据库 时序数据库

DeepSeek部署实战:模型对比、部署优化与应用场景解析

中烟创新

kimi2实测:5分钟造3D游戏+个人网站,真·国产Claude级编程体验,含Cline教程

阿星AI工作室

AI 产品经理 kimi

中烟创新灯塔大模型应用开发平台入选“2024年度百大AI产品”

中烟创新

AI时代需要什么样的园区网络?答案藏在四个新技术里

Alter

MyEMS:ISO 50006 标准下的开源能源管理利器

开源能源管理系统

开源 ISO 50006 能源管理系统

苹果电脑装机必备软件推荐,Mac圈超实用软件列表

阿拉灯神丁

实用工具 苹果软件 Tuxera NTFS教程 CleanMyMac X中文版 mac装机必备

MyEMS 开源能源管理系统与同类系统的全方位对比分析

开源能源管理系统

开源 安全生产 绿色生产 能源管理系统

第七在线成功入选中服协《2025中国服装行业创新推荐目录》

第七在线

数据不 Ready,一切 AI Ready 都是伪命题

袋鼠云数栈

数据库 大数据 数据治理 Data + AI 数据开发与治理

天猫商品详情API接口技术解析与Python实现

tbapi

天猫商品详情接口 天猫API 天猫商品数据采集

大龄青年失业,可以在哪里寻找新的工作机会

Y11

求职 找工作 招聘 转行

EMQX + Amazon S3 Tables:从实时物联网数据到数据湖仓

EMQ映云科技

mqtt Amazon S3

多模态AI,敏感数据识别的终结者

权说安全

AI 零信任 数据防泄漏

智源全面开源RoboBrain 2.0与RoboOS 2.0:刷新10项评测基准,多机协作加速群体智能

智源研究院

人工智能 具身智能

LambdaQueryWrapper遇上@Async

京东科技开发者

淘宝图片搜索接口技术解析与Python实现

tbapi

淘宝图片搜索接口 淘宝拍立淘接口 天猫图片搜索接口 天猫拍立淘接口

AI背单词App的技术方案

北京木奇移动技术有限公司

软件外包公司 AI英语学习 AI背单词

为什么你的 App 需要一个“超级大脑”?

Speedoooo

APP开发 小程序容器 小程序技术 小程序容器技术

冲进腾讯!太不容易了

王中阳Go

Go 腾讯 面试 后端

基于业务知识和代码库增强的大模型生成代码实践

京东科技开发者

提高Ruby on Rails性能的几种技巧_Ruby_崔康_InfoQ精选文章