0

如果我在ActiveRecord按列排序时应用范围,例如

User.order("name")

我应该确保列上存在索引name吗?或者只有在我做一个where子句时才需要索引。

4

1 回答 1

0

是否可以使用索引来代替排序操作取决于几个不同的因素:

  1. 这样做是否更具成本效益。如果要使用索引来访问所需的行,那么这当然会有所帮助,但是如果您想选择所有名字为“John”的人并按出生日期排序,那么您可能需要一个复合索引在 first_name 和 date_of_birth。仅 date_of_birth 的索引是不够的。
  2. 索引的排序是否与所需的顺序相同。这更复杂,适用于字符串。默认情况下,许多索引是二进制排序的,因此在 ASCII 数据集中,所有大写字母的排序都低于所有小写字母。这不太可能是您想要的顺序,而且对于 i18n 文本来说它变得更加复杂,其中不同的语言以不同的方式对特殊字符(例如带有重音符号)进行排序。您可能需要查看您的 RDBMS 是否支持具有您想要的字符集排序的索引。日期和数字当然没有这个问题。

长话短说,您默认创建的索引可能不适合对数据进行排序,即使是,也可能不是最经济有效的访问表的方式。

不过最好的方法——测试一下,如果你对没有使用的索引感到惊讶,请考虑上述因素。

于 2013-09-08T18:10:40.453 回答