在RAILS中查询比通过Mysql客户端更长的时间

时间:2011-03-21 03:58:07

标签: mysql ruby-on-rails

所以我刚开始使用RAILS。我知道这很危险。

我有很多模型做非常简单的查询,主要是通过脚手架生成的。我有一个遗留数据库,其中大部分已经与rails兼容。一切都有索引。数据库并不大,但它很重要。

在一个模型上,我只是做了一个.all而且它花了很长时间,当然这个表有大约400,000行。话虽这么说,它在Mysql中的速度更快。我拿了同一张桌子,然后尝试得到100个结果,可能需要几分钟。 mysql中的相同查询花了不到一秒钟。当我检查控制台时,我看到它完成后:

  

节点负载(0.4ms)SELECT nodes。*   FROM nodes WHERE(nodesid =   276645)LIMIT 1 CACHE(0.0ms)   SELECT profiles。* FROM   profiles在哪里   (profilesid = 0)   LIMIT 1 CACHE(0.0ms)SELECT   points。* FROM points   WHERE(pointsid = 19404)   限制1

一遍又一遍。当查询没有返回任何东西时(换句话说,我有一些逻辑不正确),它非常快。我认为它不是“加入”而是单独查询相关模型。想法?

模型看起来像这样:

class Trigger < ActiveRecord::Base
  def self.table_name() "w_trigger" end
  belongs_to :node
  belongs_to :profile
  belongs_to :point

  scope :within, lambda{|up,down,left,right| joins(:point).where('`points`.`lat` <= ? AND `points`.`lat` >= ? AND `points`.`lon` <= ? AND `points.`.`lon` >= ?',up,down,left,right)}

end

1 个答案:

答案 0 :(得分:0)

mysql查询可能需要大约相同的执行时间。如果对象创建时间你正在遭受什么。创建400000个Ruby对象,尤其是像ActiveRecord这样的相对较胖的对象,需要相当长的时间。

你真的想做什么?您显然不会尝试为Web请求呈现那么多对象。如果您愿意,您只想返回该页面所需的特定行数。

Rails中的生活就是如此。