Rails 3 - 在"数据库级别做更多事情"

时间:2013-02-20 17:49:38

标签: ruby-on-rails database optimization

我正在研究我的第一个大型Rails应用程序,我对某些事情感到有些困惑。

我知道在数据库级别做更多工作会提高性能。但我对在数据库级别运行的命令类型感到困惑。

例如:

@tasks = @project.tasks
<%= render partial: 'task', collection: @tasks %>

这是否适用于数据库级别?

谢谢,我知道这是一个非常新手的问题!

3 个答案:

答案 0 :(得分:1)

假设@project是一个与Task类关系的ActiveRecord对象,则对数据库进行提取以填充@tasks对象。

运行rails服务器时,请监视控制台的输出。它将向您显示何时对数据库进行SQL查询。这将帮助您在代码执行时理解该过程。与Rails玩得开心!

答案 1 :(得分:1)

'在数据库级别做更多工作将提高性能'

是的,它会。非常基本的铁轨,即

@thing = Thing.find(id)

非常有效,在这些情况下,您通常不会关注自己的表现,

但是,某种过滤器呢。

假设您想要实现搜索包含特定字符集的名称的功能(这是一个人为的示例,仅用于说明)

你可以这样做:

@things = Thing.all
@foothings = []
@things.each do |thing|
  if /foo/ =~ thing.name
    @foothings << thing 
  end
end

或者你可以这样做:

class Thing < ActiveRecord::Base
   def self.filtered(what)
     self.where("name like ?","%#{what}%")
   end
end


@foothings = Thing.filtered("foo")

数据库将更快地执行搜索(第二个示例)。它是高度调整和优化的C代码(可能),其中RoR仍然是一种解释语言。此外,在第一个示例中,从数据库中请求所有内容,在第二个仅返回名称中带有“foo”的内容,如果RoR计算机和数据库计算机之间存在网络延迟,这也可能会影响性能。 / p>

答案 2 :(得分:0)

数据库级别实际上不是代码的一部分,除非您实际编写了要使用的数据库。良好的程序设计与数据库的接口,就像你给mysql一个查询,它为你查询数据库并返回你在代码中使用的结果。所以数据库级别是mysql查询自己的结果,这是你想要完成大部分工作的地方,因为它已经高度优化了。性能的来源是倾倒大部分工作,例如你可以制定一个查询,如:“SELECT * from mytable”然后你会得到一大堆元素,如果那就是你想要的那么好但是如果你想要从这个集合中的特定项目,你必须在整个集合上使用一些查找算法(可能必须扫描它们全部或其他,它的不良性能)或者你可以更具体地查询数据库(SELECT * from mytable WHERE x blah)并返回一小组准备使用的结果,99%的时间会给你更好的性能。