我正在编写一个网络应用程序来监控家具厂的生产流程。它有成千上万的数据要处理。到目前为止,我在 Mongrel + MySQL 上运行 RoR,它真的很慢(某些 View 需要 2-4 分钟)。当我查看 RoR 日志时,数据库查询似乎并不慢(0-10 毫秒)。
RoR 将数据库数据转换为对象时是否很慢? Mongrel 慢吗?
编辑:第一件事:我在开发中。环境。在生产环境中,最慢的 View 需要 2 分钟(在一台性能良好的计算机上会降低到不到 1 分钟,我的已经 5 年了)。借助 ruby-prof 和一些常识,我发现了哪些方法会降低应用程序的速度。问题是在大型数据集上循环调用单个 SQL 查询:
ofs = Ofkb.find_by_sql ["..some large SQL query..."]
for of in ofs # About 700-1000 elements
ops = Operation.find(..the single query..)
etc.
end
以下是这些方法的 ruby-prof 结果:
%self total self wait child calls name
32.19 97.91 97.91 0.00 0.00 55 IO#gets (ruby_runtime:0}
28.31 86.39 86.08 0.00 0.32 32128 Mysql#query (ruby_runtime:0}
6.14 18.66 18.66 0.00 0.00 12432 IO#write (ruby_runtime:0}
0.80 2.53 2.42 0.00 0.11 32122 Mysql::Result#each_hash (ruby_runtime:0}
问题是:我真的无法避免那些单一的查询。我有数以千计的事件,我必须从中计算复杂的数据。现在,我在这些方法上使用 memcached,除非您是第一个请求该页面的人,否则这些方法没问题。
最佳答案
我会同意其他人的看法。你必须剖析。在您知 Prop 体是什么导致速度缓慢之前,对您的代码做任何事情都是没有意义的。试图在不了解原因的情况下解决问题,就像感觉不舒服并决定进行大量手术直到感觉好些一样。首先诊断您的问题。它可能是像网络设置这样的小东西,也可能是代码中的一行错误。
分析的一些技巧:
How to Profile Your Rails Application
Performance Testing Rails Applications
At the Forge - Profiling Rails Applications
一旦找到瓶颈,您就可以确定要做什么。
我推荐这些视频: Railslab Scaling Rails
现在根据教授结果修改:
好的。现在您可以看到您的问题是您正在使用基于循环另一个事件记录查询结果的查询进行某种计算,我建议您考虑构建一个自定义 SQL 语句,结合您的初始选择标准和循环计算得到你需要的。您绝对可以通过优化 SQL 来加快速度。
关于mysql - Ruby On Rails 很慢...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/566401/