我正在编写一个 Web 应用程序来监控家具厂的生产流程。它有数千个数据要处理。到目前为止,我在 Mongrel + MySQL 上运行 RoR,它真的很慢(某些视图需要 2-4 分钟)。当我查看 RoR 日志时,数据库查询似乎并不慢(0-10 毫秒)。
RoR 将数据库数据转换为对象时速度慢吗?杂种很慢吗?
编辑:第一件事:我在开发。环境。在生产环境中,最慢的视图需要 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,除非你是第一个请求页面的人。