是什么原因导致请求跟踪的这些简单组件变得如此之慢?

时间:2013-06-25 13:21:13

标签: ruby-on-rails ruby-on-rails-3

user.rb

has_many :programs, dependent: :destroy
def active_program
    programs.where(active: true).limit(1).first
end

schema.rb

add_index "programs", ["active"], :name => "index_programs_on_active"
add_index "programs", ["user_id"], :name => "index_programs_on_user_id"

程序表中只有105行。

以下是针对单个请求的New Relic跟踪细分的一部分,经过编辑以关注相关组件。

enter image description here

我不明白为什么这两个组件花了这么长时间。

我假设Program#find_by_sql正在使用默认查询跟踪,因此没有执行57次实际查询,但为什么在一个小表上执行简单查询需要1350ms呢?

另外,为什么user.active_program需要花费1070毫秒才会调用查询?

我正在使用Rails 3.2.13和Ruby 1.9.3p429。

2 个答案:

答案 0 :(得分:0)

试试这个:

User.includes(:programs).where("programs.active" => true).limit(1).first

Documentation

答案 1 :(得分:0)

获得更多见解的好方法,SQLs Rails将为您创建的内容以及它们的执行方式可以查看SQL的日志并在MySQL中尝试EXPLAIN [YOUR_SQL],这将为您提供一些不错的提示

EXPLAIN