时间戳vs datetime vs int - 有和没有索引 - 测试

时间:2013-02-17 13:06:24

标签: mysql performance datetime timestamp

在我的情况下,我只会测试,哪个日期时间格式对于我的查询持续时间是最佳的。这是我的疑问:

   SELECT 
    max(ColumnA), -- bigint
    CreateDate, 
    ColumnB, 
    EndTime, 
    ColumnC, 
    ColumnD, 
    ColumnE, 
    ColumnF, -- int
    StartTime, -- timestamp or datetime or int - UNIX_TIMESTAMP(StartTime)
    ColumnG, 
    ColumnH, 
    ColumnI, 
    ColumnJ, 
    UpdateDate, 
    ColumnK FROM TABLE

条件:

-- with indexes
  (Iteration 1) WHERE StartTime BETWEEN "2013-01-18 16:50:00" AND "2013-10-18 18:05:00" AND ColumnF in(5428) GROUP BY ColumnF,StartTime
  (Iteration 2) WHERE StartTime BETWEEN "2013-05-18 11:00:00" AND "2013-06-23 22:05:00" AND ColumnF in(5428) GROUP BY ColumnF,StartTime
  (Iteration 3) WHERE StartTime BETWEEN "2013-08-18 11:00:00" AND "2013-08-23 22:05:00" AND ColumnF in(7752) GROUP BY ColumnF,StartTime
  (Iteration 4) WHERE StartTime BETWEEN "2013-01-18 16:50:00" AND "2013-10-18 18:05:00" AND ColumnF in(5428,5675,444) GROUP BY ColumnF,StartTime
  (Iteration 5) WHERE StartTime BETWEEN "2013-09-01 16:50:00" AND "2013-09-15 18:05:00" AND ColumnF in(5428,5675,444) GROUP BY ColumnF,StartTime
-- and same without indexes

测试信息:

Count = 400K
Engine version = 5.6.10
DBEngine = InnoDB
Tests procedure - MySQL restart before any query.

结果:

With index on StartTime, with index on ColumnF                      

    Iteration   1      2       3       4       5
timestamp   0.094   0.094   0.124   0.124   0.125
datetime    0.125   0.109   0.141   0.156   0.156
int         0.125   0.124   0.094   0.156   0.156
Rows            38     8       1       128  8

Without index on StartTime, with index on ColumnF                   
    Iteration   1      2       3       4      5
timestamp   0.078   0.062   0.062   0.109   0.125
datetime    0.078   0.078   0.078   0.140   0.125
int         0.078   0.078   0.078   0.140   0.125
Rows            38     8       1       128      8

所以我决定使用没有索引的Timestamps(但没有索引结果看起来非常相似)。

编辑: 我真的不知道为什么我决定只使用一个查询。也许这是懒惰,也许我不应该在周日工作:)现在测试是无关紧要的,结论是错误的。当我进行测试时,我重写所有测试信息......正常:)

EDIT2: 固定

1 个答案:

答案 0 :(得分:2)

有一天,我问了一个关于when we chose Datetime over Timestamp的问题。我认为你不会通过整数时间戳获得大量时间。 另外,请记住,TIMESTAMPDATETIME是MySQL中的别名,如果使用PostgreSQL,则只有TIMESTAMP。所以在这里,你的测试似乎是无关紧要的。

编辑:他们等价。他们只是以同样的方式形成。事实上,Timestamp只是一个时间不同的类型。它让你摆脱这件事。但它会带给你较少的定制,并且从1970年到2038年受到限制。如果你有其他日期存储(早期或晚期),你将失败。

有两件事让我这么说:

  • 两次迭代
  • 没有任何偏差指标
  • 您正在测试的所有内容几乎没有差异

INTTIMESTAMP之间的巨大差异是记忆中的位置。你没有测试它。观察到的时间跨度非常短。

我想你猜我完全支持DateTime而不是整数。