2011-03-21 47 views
1

所以我刚开始使用RAILS。我知道这足够危险。在RAILS中查询的时间比通过Mysql客户端长得多

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

在一个模型上,我只是做了一个.all,并且它花了很长时间,当然这张表有大约400,000行。话虽如此,但Mysql中的WAYY速度更快。我拿了同一张桌子,然后试图得到100个结果,花了几分钟时间。在MySQL中的相同查询不到一秒钟。当我检查我看到了这一点做的控制台:

节点的负载(0.4ms)选择nodes * FROM WHERE nodesnodesid = 276645)LIMIT 1 CACHE(0.0ms) SELECT profiles。* FROM profiles WHERE (profilesid = 0) LIMIT 1 CACHE(0.0ms)SELECT points。* FROM points WHERE(pointsid = 19404) LIMIT 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

MySQL查询可能是服用的时间大致执行相同的金额。如果对象创建时间你正在遭受什么。创建400000个Ruby对象,特别是像ActiveRecord那样相对较胖的对象需要相当长的时间。

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

因此,生活在Rails中。

+0

Ahh有意思......我把它放到了30-40项左右......这次更快了。对于大约几百个大数据集有没有优化?如果您正在以图形或地理方式绘制东西......一次抓取一堆物品非常有用。有没有办法解除和绑定关系以加快速度? – Parris 2011-03-21 06:56:47

+0

你应该只抓住你需要的东西。对数百个物体进行操作应该是完全合理的。尽管我听说有多个范围查询(使用> =而不是=)没有帮助,但只有其中一个范围可以使用索引,您应该在这些列上有索引以确保快速搜索。 – gleenn 2011-06-28 06:14:34