【问题标题】:Making ActiveRecord / Rails use actual mysql TIMESTAMP columns使 ActiveRecord / Rails 使用实际的 mysql TIMESTAMP 列
【发布时间】:2012-03-02 22:08:26
【问题描述】:

Rails 的:timestamp 列类型所在;它实际上只是:datetime 的别名。

我正在使用 mysql,我想使用实际的 unix-timestamp TIMESTAMP 列。

a) 除了使用 SQL 来创建列之外,还有什么好的设置方法吗?

b) ActiveRecord 会正确处理它吗(例如,必要时转换为Time,接受unix 时间戳Integer 作为输入等)?我应该在哪里处理哪些问题?

为什么:

  1. 速度。这是一个非常活跃的表,它聚合了已经使用 unix 时间戳的外部数据源。转换为日期时间(或者甚至首先转换为一个数据库字符串,它经过 2 gsubs)占用了大部分导入时间。否则我可能只会打一个非常便宜的Integer#to_s 电话。

  2. 时区。我不想要他们。我希望它与时区无关地存储;处理时区是一件痛苦的事情,并且与我的需求完全无关,除非是在个人用户显示之前的最后阶段。数据本身不需要知道它记录在哪个时区。

  3. 尺寸。这是一张大桌子。 TIMESTAMP is half the size of DATETIME.

是的,我仍然会在代码中进行updated_at 计算,而不是 mysql。那部分不是瓶颈。

为什么你的“为什么不”是错误的(先发制人地表明我不是在问愚蠢的原因:-P):

  1. “但 TIMESTAMP 自动更新”:That's only true by default, and can be easily switched off.
  2. 我实际上没有使用 Rails,只是使用 ActiveRecord。
  3. 是的,这是基于actual profiling data;我不是早期优化。 ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote(在Quoting#quoted_date [如果通过Time] 或Mysql2Adapter#quote_string [如果预转换to_s(:db)])实际上是我的爬虫中最消耗CPU 的部分。我想摆脱它。

【问题讨论】:

  • 如果您使用的是 Rails (#2),这有什么关系? (我正在使用 Rails,但考虑使用时间戳来节省空间。)

标签: mysql ruby-on-rails activerecord timestamp


【解决方案1】:

这行得通(只是在类型定义中添加了空白字符,所以 :timestamp 不会覆盖它):

     t.add_column :sometable, :created_at, 'timestamp '

【讨论】:

    【解决方案2】:

    我很菜鸟,但我会试一试。如果您要添加自己的自定义列或覆盖默认列怎么办?您可以使用带有字符串的自定义数据类型,如下所示:

    t.add_column :mysql_timestamp, 'timestamp'
    

    然后在你的逻辑中的其他地方

    def mysql_timestamp
      Time.now.strftime("%Y-%m-%d %H:%M:%S")
    end
    

    不确定 b)。只有一种方法可以找出答案!

    【讨论】:

    • 'timestamp' 列类型不是 TIMESTAMP,它是 DATETIME。
    • 仅当它是一个符号时。如果你使用一个字符串,它可以是任何你想要的,至少,根据@tadman 在这篇文章stackoverflow.com/questions/4100209/… 中的说法,我还没有尝试过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多