2011-02-15 161 views
1

我有一个查询在MySQL控制台中运行速度非常快,但使用Rails Active Record运行时速度很慢。这是针对700万条记录的表运行查询:查询在MySQL中速度很快,但从Rails运行时速度很慢ActiveRecord

选择 broker_id,计数(abserror),AVG(abserror) fc_estimates 其中(FPE> '2000年5月28日') and(fpe <'2003-06-30')group by broker_id order by broker_id;

需要3分钟才能运行。

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

stats =估计值。 选择([ “broker_id”, “计数(abserror)作为abserror_count”, “AVG(abserror)作为abserror_avg” ])。 其中(:fpe =>((fpe-1098).to_date ..(fpe + 30).to_date)) (“broker_id”)。 顺序( “broker_id”)

生成此SQL(从to_sql输出)

SELECT broker_id,计数(abserror)作为abserror_count,AVG(abserror)作为abserror_avg FROMfc_estimatesWHEREfc_estimatesfpe之间 '2000年5月28日' '2003-06-30')GROUP BY经纪人_id ORDER BY broker_id

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

我使用Windows 7,MySQL 5.1中,红宝石1.8.7,ActiveRecord的3.04,mysql2宝石0.2.6

这是InnoDB表和我有innodb_buffer_pool_size提高到480M(这确实与其他问题的帮助) 。我所观察到的一件事是,MySQL内存使用量高达约500M,然后有很多磁盘活动(页面交换)。这可以解释为什么。

但是为什么我在MySQL控制台中运行同样的查询只需要3分钟时性能很差?感谢任何想法或经历过类似情况的任何人。

UPDATE 2011-02-24

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

+0

您可能会看到mysql查询缓存的结果。尝试在mysql中再次计时查询,但在SELECT之后放置SQL_NO_CACHE以禁用查询缓存。 – 2011-02-15 13:29:40

+0

是的,我想我明白这一点。第二次在控制台中运行查询时,运行速度非常快。所以我的查询在3分钟内运行 - 第二次运行速度非常快。我不认为就是这样,但我会检查。 – 2011-02-15 13:38:50

回答

1

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

Windows不是使用MRI的最佳地点。也许你应该尝试1.9.2或JRuby - 甚至切换到一些* nix OS。

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

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

相关问题