“map”语句的SQL查询性能

时间:2011-03-08 09:47:53

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

我正在使用Ruby on Rails 3,我想知道这些查询语句的性能差异是什么:

# Case 1
accounts = ids.map { |id| Account.find_by_id(id) }

# Case 2
accounts = ids.map { |id| Account.where(:id => id).first }

还有另一种方法可以做得更好吗? 如果ids为100 我怎样才能限制搜索,直到帐号为5?< /强>

2 个答案:

答案 0 :(得分:5)

正如@RubyFanatic所说,这两者之间没有真正的区别(他们都会生成相同的查询),但有一种更好的方法:

accounts = Account.where(:id => ids)

这将生成类似select * from accounts where accounts.id in (1,2,3)的sql,并且比一次找到一个快得多。

如果你只想使用id数组中的5个id,你需要决定使用哪个5。例如,如果您想使用前5;

accounts = Account.where(:id => ids[0..4])

或者,你可以使用limit,但这使得如果id数组很大,查询还需要做更多的工作:

accounts = Account.where(:id => ids).limit(5)

答案 1 :(得分:1)

这两个查询应该没有性能差异。他们确实在做同样的事情。第二个声明可能会稍微慢一点,但它太微不足道了,甚至不重要。