【问题标题】:Rails Minimizing Database LoadRails 最小化数据库负载
【发布时间】:2011-11-07 22:03:12
【问题描述】:

我对 Rails 比较陌生。我知道 Rails 可以让您轻松地使用数据库值,但对于哪种方法对数据库更节能,哪种方法更节能,我有点盲目。

这是一个恰当的例子。我有一个属于用户的模型约会。在我的语法中,我有时可以说process_user @appointment.user当我写这个时,是否会在数据库上运行一个单独的 SELECT 查询来检索该用户?process_user @appointment.user_id 其中 user_id 是约会中的一个属性然后尝试使用 user_id 是否更有效只要我不需要整个用户对象@appointment.user,就可以执行与评估相关的任务。

坦率地说,从安心的角度来看,我只是喜欢能够使用process_user @appointment.user,因为它在准备逻辑时读起来更好、看起来更好并且工作得更好。这是一种高效的方式吗?

【问题讨论】:

  • 如果您是 Rails 新手,请不要开始纠结于效率问题。 Rails 不是目前最快或最有效的框架,但它的好处是它易于使用并且为您做了很多工作。如果您需要优化,请稍后再做。

标签: ruby-on-rails ruby database optimization query-optimization


【解决方案1】:

您可以使用您的约会模型急切地加载您的关联用户:

Appointment.all(:include => :user)

...它将加入用户或在单个查询中对所有关联用户进行单独查找。

这将提前(急切地)加载用户关联,因此当您引用它时,用户属性已经填充了对象,而不必停止并执行单独的查询来一一查找(N+ 1 个查询)。

【讨论】:

    【解决方案2】:

    您完全可以使用process_user @appointment.user 之类的代码,因为 ActiveRecord 会尽力减少数据库查询的数量。当然它不能完美地处理所有情况,但你的例子是一个非常基本的例子。可能不会立即发生数据库查询,并且只有在访问其属性时才会加载对象。

    如果您在运行的大型应用程序中发现性能问题,并且可以使用分析将问题跟踪到 ActiveRecord,则可能是时候进行优化了。从一开始就尝试预先优化将违反 Rails 的理念,只会导致丑陋(甚至可能更慢)的代码。请记住,真正的性能瓶颈通常在您意想不到的地方。

    编辑: 正如 Winfield 所指出的,优化查询数量通常并不意味着自己管理外键或类似的内部结构。数据库访问方法有很多标志和选项,可让您控制数据库的查询方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多