我应该在Ruby on Rails 3.0中为日期列编制索引吗?

问题描述

| 环境:MysqL,Rails 3.0.7 在我的用户表中,我有一个“'last_activity_date \'”列,该列使用分散在整个应用程序中的各种after_save挂钩进行了更新。 我目前有以下命名范围:
scope :active,lambda { where(\'last_activity_date >= ?\',1.month.ago) }
经常使用。由于缺乏选择性,并且由于更新频率相当高(对于某些用户每天更新,而对其他用户很少,因此),似乎不值得对该列建立索引。 随着用户数量的增长,使用“活动”范围的查询花费的时间越来越长。从长远来看,索引\'last_activity_date \'列是否值得?     

解决方法

        如果查询看起来像您的评论:
SELECT users.* 
FROM users
WHERE (last_activity_date >= \'2011-05-22 00:26:52\')
  AND (users.id >= 0)
ORDER BY users.id ASC
LIMIT 1000
那么可以肯定的是,使用queries2ѭ上的简单索引,这些查询的性能将大大提高 我猜
users.id
是表的
PRIMARY KEY
,因此已经有一个索引了。 当您没有索引时,查询必须扫描整个
users
表,以检查哪些行满足条件
last_activity_date >= 1 month ago
。对于少数用户而言,这并不引人注目。拥有成千上万(或数百万)用户,这确实很慢。     ,        一条经验法则说,您应该索引WHERE子句中使用的每个列。因此,我将其编入索引。 您可以使用这样的查询来判断其选择性。
SELECT last_activity_date,count(*)
FROM users
GROUP BY last_activity_date