我正在运行以下查询:
User.where("number > ?", 5).order(&:age).first(20)
我注意到,无论我将“first(20)”替换为“first(200)”还是“first first”,查询的速度大致相同。这似乎意味着服务器检索所有记录,无论我在数组中实际需要多少记录。有没有办法加快这个过程?
答案 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)