rails – 在用户订购时created_at,是否应该向表中添加索引?

您好,我有一张我的模特照片:

default_scope :order => 'photos.created_at DESC, photos.version DESC' 

鉴于我按CREATED_AT和版本订购……我应该在CREATED_AT上有DB索引吗?

谢谢

以下是基于我的PostgreSQL经验,但也可能适用于MySQL等。

如果您计划从此表中检索大量记录或使用分页,则ORDER BY使用的字段的索引将非常有用。

您应该以相同的顺序在所有订单字段上创建索引。 如果要在ORDER BY中混合使用ASCDESC ,则需要使用这些特定顺序创建索引以充分利用索引。

适用于您的照片表的ActiveRecord迁移将是:

 add_index :photos, [:created_at, :version] 

我建议在添加索引之前和之后查看EXPLAIN ANALYZE输出和类似生成的数据,以确认它具有您所追求的效果。

一个可能有用的技巧:在典型的MySql / ActiveRecord模型中,您将id作为数字主键(因此隐式索引),其应该与created_at顺序相同 – 这意味着您可以通过id排序并获取快速的性能,没有额外索引的写入成本。

刚刚在这个晚上阅读,因为我正在为多个表添加索引。 简短的回答是’是’。 这个案例在这里非常有说服力:

http://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes

更长的答案也是“是”,但为什么不对它进行测试,看看你根据应用程序与数据的交互方式得出的里程数。