gpt4 book ai didi

mysql - 查询在 MySQL 中很快,但从 Rails ActiveRecord 运行时很慢

转载 作者:行者123 更新时间:2023-11-29 03:13:08 24 4
gpt4 key购买 nike

我有一个查询,它在 MySQL 控制台中运行得非常快,但是当我使用 Rails Active Record 运行它时却非常慢。这是针对包含 700 万条记录的表运行的查询:

选择 broker_id,count(abserror),avg(abserror) from fc_estimates where ( fpe > '2000-05-28') ( fpe < '2003-06-30') group by broker_id order by broker_id;

运行需要 3 分钟。

然后我在 Rails Active Record 中运行这个查询:

统计数据 = 估计。 选择([ “经纪人ID”, “将(错误)计数为 abserror_count”, “平均(错误)作为 abserror_avg” ]). 在哪里( :fpe => ((fpe-1098).to_date..(fpe+30).to_date)) (“broker_id”)。 订单("broker_id")

生成此 sql(从 to_sql 输出)

SELECT broker_id, count(abserror) 作为 abserror_count, avg(abserror) 作为 abserror_avg FROM fc_estimates WHERE (fc_estimates.fpe BETWEEN '2000-05-28' AND '2003-06-30') < strong>GROUP BY broker_id ORDER BY broker_id

运行需要 1 小时 40 分钟。它返回 250 条记录。

我正在使用 Windows 7、MySQl 5.1、Ruby 1.8.7、ActiveRecord 3.04、mysql2 gem 0.2.6

这些是 InnoDB 表,我已将 innodb_buffer_pool_size 增加到 480M(这对其他查询有帮助)。我确实观察到的一件事是 MySQL 内存使用量增加到大约 500M,然后有很多磁盘事件(页面交换)。这确实解释了一些事情。

但为什么当在 MySQL 控制台中运行相同的查询只需要 3 分钟时,我的性能却如此糟糕?感谢任何想法或遇到过类似情况的任何人。

更新 2011-02-24

我更新到 MySQL 5.5。现在,我在控制台中的查询运行时间约为 1 分钟 40 秒。使用 ActiveRecords 大约需要 40 分钟。

最佳答案

在您的 ruby​​ 代码中运行的不仅仅是 SQL 查询。我不是 Ruby Jedi,但我可以指出一些东西。

Windows 不是使用 MRI 的最佳场所。也许您应该尝试 1.9.2 或 JRuby - 或者甚至切换到某些 *nix 操作系统。

(fpe-1098).to_date..(fpe+30).to_date)为日期间隔构建一个 Range 实例。也许你应该尝试不同的语法,即:['fpe > ? AND fpe < ?'(fpe-1098),(fpe+30)] - 因此将创建更少的对象。

因为您没有检索 Estimate实例,而不是使用模型类运行查询,您可以将生成的 sql 传递给 ActiveRecord::Base.connection.execute .也许会有更少的内存使用和创建的对象。

关于mysql - 查询在 MySQL 中很快,但从 Rails ActiveRecord 运行时很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5004204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com