0

听起来可能有点愚蠢,但我不是数据库专家。

例如,如果我们有一个User模型和一个Comment模型,并且每个评论都属于一个用户,那么有两种方法可以获取所有评论及其用户:

# 1.
@comments = Comment.all(:include => :user)

# 2. 
@comments = Comment.all()
@users = []
@comments.each do |comment| # Or we do the same loop in embedded code in the view
  @users << User.find(comment.user)
end

我的问题是,由于这两种方法都将获取所有评论及其用户数据(这意味着我们从硬盘驱动器和通过互联网读取和传输相同数量的信息),为什么第二种方法被认为是一种不好的做法?

4

2 回答 2

4

请允许我说明原因:

Message.count
13228

Benchmark.measure { Message.all.each(&:user) }
16s

Benchmark.measure { Message.all(include: :user).each(&:user) }
2s

有 100 行,这是一个更现实的获取:

Benchmark.measure { Message.limit(100).each(&:user) }
0.12s

Benchmark.measure { Message.includes(:user).limit(100).each(&:user) }
0.01s

如您所见,数据库速度提高了大约 10 倍,压力也更小。

于 2013-10-29T18:18:46.107 回答
2

一次又一次地访问数据库以获取与User记录关联的Comment记录将影响应用程序的性能。

如果评论数量过多并且您正在循环通过它以获取所有关联用户,则这会变得更加缓慢。

而如果Comment.all(:include => :user只有两个查询将一直被触发。一个获取评论,一个获取所有关联用户。

于 2013-10-29T17:56:27.350 回答