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

AnA*_*ice 16 ruby-on-rails ruby-on-rails-3

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

default_scope :order => 'photos.created_at DESC, photos.version DESC'
Run Code Online (Sandbox Code Playgroud)

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

谢谢

che*_*rbr 19

一个可能有用的技巧:在典型的MySql/ActiveRecord模型中,您将拥有id一个数字主键(因此隐式索引),它应该具有相同的顺序created_at- 这意味着您可以通过命令id来获得快速性能,没有额外索引的写入成本.


Jas*_*red 11

以下是基于我的PostgreSQL经验,但可能也适用于MySQL和其他人.

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

您应该以相同的顺序在所有订单字段上创建索引.如果混合ASCDESCORDER BY你需要创建这些特定排序的索引走索引的充分利用.

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

add_index :photos, [:created_at, :version]
Run Code Online (Sandbox Code Playgroud)

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


Cor*_*ory 10

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

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

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