rails – 在用户订购时created_at,是否应该向表中添加索引?
您好,我有一张我的模特照片:
default_scope :order => 'photos.created_at DESC, photos.version DESC'
鉴于我按CREATED_AT和版本订购……我应该在CREATED_AT上有DB索引吗?
谢谢
以下是基于我的PostgreSQL经验,但也可能适用于MySQL等。
如果您计划从此表中检索大量记录或使用分页,则ORDER BY
使用的字段的索引将非常有用。
您应该以相同的顺序在所有订单字段上创建索引。 如果要在ORDER BY
中混合使用ASC
和DESC
,则需要使用这些特定顺序创建索引以充分利用索引。
适用于您的照片表的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
更长的答案也是“是”,但为什么不对它进行测试,看看你根据应用程序与数据的交互方式得出的里程数。