Rails 4 / postgresql index - 我应该使用一个datetime列作为索引过滤器,它可以有无限数量的值吗?

时间:2015-08-16 13:36:53

标签: mysql ruby-on-rails ruby postgresql ruby-on-rails-4

我需要优化查询以获取某个国家/地区的所有交易,然后才能在某个特定日期时间之前访问某个国家/地区。

我的计划是实施以下索引

add_index(:deals,[:country_id,:last_user_access_datetime])

我怀疑这个索引的相关性和有效性,因为列last_user_access_datetime可以具有日期的任何值ex:13/09/2015 3:06 pm并且它会经常更改(每次用户访问它时都会更新)。 如果我使用这个索引,这会使无限数量的值被索引?

我应该这样做还是避免使用无限的可能的列,例如索引中的完全免费的日期时间列?

2 个答案:

答案 0 :(得分:1)

如果您有这样的查询:

select t.
from table t
where t.country_id = :country_id and t.last_user_access_datetime >= :some_datetime;

然后最好的指数是你建议的那个。

如果您在访问方面负载很重(并且认为每个第二次进行多次访问),那么维护索引可能会成为计算机的负担。当然,无论如何,您正在更新上次访问日期时间值,因此您已经产生了开销。

可能值的数量对值没有影响。数据库无法存储"无限"值的数量(至少在当前可用的任何硬件上),所以我不确定您的顾虑是什么。

答案 1 :(得分:0)

将使用索引。 UPDATE和INSERT语句的时间只需要更长的时间,因为索引每次都会更新。对于具有比SELECT更多UPDATE / INSERT的表,索引列可能没那么富有成效。或者,您可能希望创建一个看起来更像是命中表的查询类型的索引。包括SELECT子句中的ID和时间戳。包括WHERE子句中的ID和时间戳。等

另外,如果一个表有很多DELETE,那么很多索引可能会大大减慢操作速度。