所以我刚开始使用RAILS。我知道这很危险。
我有很多模型做非常简单的查询,主要是通过脚手架生成的。我有一个遗留数据库,其中大部分已经与rails兼容。一切都有索引。数据库并不大,但它很重要。
在一个模型上,我只是做了一个.all而且它花了很长时间,当然这个表有大约400,000行。话虽这么说,它在Mysql中的速度更快。我拿了同一张桌子,然后尝试得到100个结果,可能需要几分钟。 mysql中的相同查询花了不到一秒钟。当我检查控制台时,我看到它完成后:
节点负载(0.4ms)SELECT
nodes
。* FROMnodes
WHERE(nodes
。id
= 276645)LIMIT 1 CACHE(0.0ms) SELECTprofiles
。* FROMprofiles
在哪里 (profiles
。id
= 0) LIMIT 1 CACHE(0.0ms)SELECTpoints
。* FROMpoints
WHERE(points
。id
= 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
答案 0 :(得分:0)
mysql查询可能需要大约相同的执行时间。如果对象创建时间你正在遭受什么。创建400000个Ruby对象,尤其是像ActiveRecord这样的相对较胖的对象,需要相当长的时间。
你真的想做什么?您显然不会尝试为Web请求呈现那么多对象。如果您愿意,您只想返回该页面所需的特定行数。
Rails中的生活就是如此。