【问题标题】:Rails 4/ postgresql index - Should I use as index filter a datetime column which can have infinite number of values?Rails 4/ postgresql 索引 - 我应该使用可以有无限个值的日期时间列作为索引过滤器吗?
【发布时间】:2015-08-16 13:36:52
【问题描述】:

我需要优化一个查询,以获取某个国家/地区的所有交易,以便用户在某个日期时间某个时间之前访问。

我的计划是实现以下索引

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

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

我应该这样做还是避免使用'infinite vlaues possible column,例如索引中完全免费的日期时间列?

【问题讨论】:

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


    【解决方案1】:

    如果您有这样的查询:

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

    那么最好的索引就是你提出的那个。

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

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

    【讨论】:

    • 我是一名 Rails 菜鸟,并不完全确定索引在幕后是如何工作的,所以我担心索引会在每次出现新值时重新存储附加数据。例如,如果我添加一个像德国这样的国家,并且某些对象的值是德国,那么它将为德国添加很多预索引。没关系,因为没有那么多国家,但我担心 Rails 会为每次(下午 1:00、下午 1:01、下午 1:02 ......)索引对象等等,这将占用大量空间,因为所有日期时间值是可能的。
    • @Mathieu 。 . .索引是数据库中的一种数据结构。我(通常)复制索引中的所有字段,并增加少量额外开销。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 2011-09-19
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2018-02-25
      • 1970-01-01
      相关资源
      最近更新 更多