【问题标题】:Query in RAILS taking WAY longer than via Mysql client在 RAILS 中查询比通过 Mysql 客户端花费更长的时间
【发布时间】:2011-03-21 03:58:07
【问题描述】:

所以我刚开始使用 RAILS。我只知道够危险。

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

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

节点负载 (0.4ms) SELECT nodes.* 来自nodes 哪里(nodes.id = 276645) 限制 1 个缓存 (0.0ms) 选择profiles.* 来自 profiles在哪里 (profiles.id = 0) 限制 1 个缓存 (0.0ms) 选择 points.* 来自points 在哪里(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

【问题讨论】:

    标签: mysql ruby-on-rails


    【解决方案1】:

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

    你真正想做什么?您显然没有尝试为 Web 请求呈现那么多对象。如果是,您可能只想返回该页面所需的特定行数。

    这就是 Rails 中的生活。

    【讨论】:

    • 啊有趣...我把它减少到大约 30-40 项...这次要快得多。对大约几百个的大型数据集是否有任何优化?如果您正在以图形或地理方式映射事物......一次抓取一堆项目很有用。有没有办法即时解除和绑定关系以加快处理速度?
    • 你应该只抓住你需要的东西。对数百个对象进行操作应该是完全合理的。您绝对应该在这些列上设置索引,以确保您快速搜索,尽管我听说有多个范围查询(使用 >= 而不是 =)没有帮助,只有一个范围可以使用索引。
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 2018-10-30
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2019-11-22
    相关资源
    最近更新 更多