优化从数据库中检索少量记录?

时间:2015-03-24 17:45:40

标签: ruby-on-rails ruby database performance

我正在运行以下查询:

User.where("number > ?", 5).order(&:age).first(20)

我注意到,无论我将“first(20)”替换为“first(200)”还是“first first”,查询的速度大致相同。这似乎意味着服务器检索所有记录,无论我在数组中实际需要多少记录。有没有办法加快这个过程?

3 个答案:

答案 0 :(得分:2)

您可以使用limit执行查询:

User.where("number > ?", 5).order(:age).limit(20)

查看此Rails Guides article以获取更多示例。

祝你好运!

答案 1 :(得分:2)

性能可能很相似,因为通常数据库必须识别符合条件的所有行,然后对它们进行排序,然后从排序集中读取前n行。如果n为200,那么显然它必须向应用程序返回更多行,但数据库性能的主要驱动程序可能不是返回的行数,而是要订购的行数。

正如其他人所说:

User.where("number > ?", 5).order(:age).limit(20)

......或者获得年龄最高的人......

User.where("number > ?", 5).order(:age => :desc).limit(20)

(Rails 4语法)

有时数据库可以使用索引来提供排序顺序,在这种情况下,您可能会看到20或200行之间的性能差异要大得多。

答案 2 :(得分:1)

您可以使用限制,因为您订购了结果:

User.where("number > ?", 5).order('age desc').limit(20)