1

用户.rb

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

架构.rb

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

程序表中只有 105 行。

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

在此处输入图像描述

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

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

user.active_program另外,当它调用查询时,为什么要花 1070 毫秒?

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

4

2 回答 2

0

尝试这个:

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

文档

于 2013-07-01T14:19:23.850 回答
0

获得更多见解的好方法是,SQLs Rails 将为您创建什么以及它们如何执行,您可以通过查看 SQL 日志并EXPLAIN [YOUR_SQL]在 MySQL 中尝试,这将为您提供一些很好的提示。

解释

于 2013-07-07T19:04:41.387 回答