【问题标题】:Do standard "order" clauses in ActiveRecord require an index?ActiveRecord 中的标准“顺序”子句是否需要索引?
【发布时间】:2013-09-11 16:37:30
【问题描述】:

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

User.order("name")

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

【问题讨论】:

  • 拥有一个索引绝对是有好处的,这样DBMS就可以使用索引进行排序而无需额外的排序。
  • 答案取决于各种各样的事情。例如:您多久执行一次此查询(即维护索引的开销是否会超过没有索引的排序成本)?当您检查带有和不带有索引的查询计划时,您的数据库会说什么?您可能确实需要索引,但也可能不需要,这取决于您在做什么以及您的数据是什么样的。
  • @muistooshort 是否有一种简单的方法可以使用 Rails 检查索引是否有益?加载一堆记录并以某种方式查询?
  • 最简单的方法是加载一堆记录,弄清楚你将使用什么样的 SQL,然后使用你的数据库版本的 EXPLAIN 来查看数据库对你的 SQL 的看法.基本上,把 Rails 推开,弄脏你的手。 IMO 无论如何,您都应该将数据库视为一个单独的应用程序;我知道 Rails 想假装数据库本身并不真正存在,但这是一种愚蠢的态度。

标签: ruby-on-rails database activerecord indexing


【解决方案1】:

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

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

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

最好的方法 - 测试一下,如果您对未使用的索引感到惊讶,请考虑上述因素。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 2017-12-19
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多