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

时间:2010-12-14 23:58:37

标签: ruby-on-rails ruby-on-rails-3

您好我的一张模特照片:

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

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

由于

3 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:9)

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

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

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

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

add_index :photos, [:created_at, :version]

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

答案 2 :(得分:9)

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

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

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