我正在运行以下查询:

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

我注意到,无论是将“first(20)”替换为“first(200)”,还是仅仅将“first”替换为“first(200)”,查询的速度都差不多。这似乎意味着所有记录都由服务器检索,不管我实际需要在数组中有多少记录。有什么办法可以加快这一进程吗?

最佳答案

性能可能很相似,因为一般情况下,数据库必须标识所有符合条件的行,然后对它们进行排序,然后从排序集读取前n行。如果n是200,那么显然它必须向应用程序返回更多的行,但是数据库性能的主要驱动因素可能不是返回的行数,而是要排序的行数。
正如其他人所说:

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

…或者让年龄最大的人…
User.where("number > ?", 5).order(:age => :desc).limit(20)

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

10-05 23:51
查看更多