所以我刚开始使用RAILS。我知道这足够危险。在RAILS中查询的时间比通过Mysql客户端长得多
我有一堆模型做非常简单的查询,主要是通过脚手架生成。我有一个遗留数据库,其中大部分已经是轨道兼容的。一切都有索引。数据库并不庞大,但它很重要。
在一个模型上,我只是做了一个.all,并且它花了很长时间,当然这张表有大约400,000行。话虽如此,但Mysql中的WAYY速度更快。我拿了同一张桌子,然后试图得到100个结果,花了几分钟时间。在MySQL中的相同查询不到一秒钟。当我检查我看到了这一点做的控制台:
节点的负载(0.4ms)选择
nodes
* FROM WHEREnodes
(nodes
id
= 276645)LIMIT 1 CACHE(0.0ms) SELECTprofiles
。* FROMprofiles
WHERE (profiles
。id
= 0) LIMIT 1 CACHE(0.0ms)SELECTpoints
。* FROMpoints
WHERE(points
。id
= 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
Ahh有意思......我把它放到了30-40项左右......这次更快了。对于大约几百个大数据集有没有优化?如果您正在以图形或地理方式绘制东西......一次抓取一堆物品非常有用。有没有办法解除和绑定关系以加快速度? – Parris 2011-03-21 06:56:47
你应该只抓住你需要的东西。对数百个物体进行操作应该是完全合理的。尽管我听说有多个范围查询(使用> =而不是=)没有帮助,但只有其中一个范围可以使用索引,您应该在这些列上有索引以确保快速搜索。 – gleenn 2011-06-28 06:14:34