您好我的一张模特照片:
default_scope :order => 'photos.created_at DESC, photos.version DESC'
鉴于我按CREATED_AT和版本订购......我应该在CREATED_AT上有一个DB索引吗?
由于
答案 0 :(得分:17)
一个可能有用的技巧:在典型的MySql / ActiveRecord模型中,您将id
作为数字主键(因此隐式索引),其应与created_at
的顺序相同 - 这意味着您可以通过id
订购并获得快速性能,而无需额外索引的写入成本。
答案 1 :(得分:9)
以下内容基于我的PostgreSQL经验,但可能也适用于MySQL等。
如果您计划从此表中检索大量记录或使用分页,ORDER BY
中使用的字段的索引将非常有用。
您应该以相同的顺序在所有订单字段上创建索引。如果您在ASC
混合DESC
和ORDER BY
,则需要创建具有这些特定排序的索引,以充分利用索引。
适用于照片表的ActiveRecord迁移将是:
add_index :photos, [:created_at, :version]
我建议在添加索引之前和之后查看EXPLAIN ANALYZE
输出和类似生成的数据,以确认它具有您所效应的效果。
答案 2 :(得分:9)
刚刚在这个晚上阅读,因为我正在为多个表添加索引。简短的回答是'是'。这个案例在这里很有说服力:
http://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes
更长的答案也是“是”,但为什么不对它进行测试,看看你根据应用与数据的互动方式得出的里程数。