日期时间与日期和时间Mysql

时间:2013-08-21 11:31:45

标签: mysql

我通常使用datetime字段来存储应用程序中created_time更新的数据时间。

但是现在我遇到了一个数据库表,他们在表中保存了日期和时间字段。

  1. 那么应该使用其中两个的架构以及为什么?
  2. 使用两个人有什么利弊?

4 个答案:

答案 0 :(得分:31)

在DATETIME字段上方使用DATE字段时,性能存在巨大差异。我有一个包含超过4.000.000条记录的表格,为了测试目的,我添加了两个带有自己索引的字段。一个使用DATETIME,另一个使用DATE。

我禁用了MySQL查询缓存,以便能够正确测试并循环查询1000x的相同查询:

SELECT * FROM `logs` WHERE `dt` BETWEEN '2015-04-01' AND '2015-05-01' LIMIT 10000,10; 日期时间指数: 197.564秒。

SELECT * FROM `logs` WHERE `d` BETWEEN '2015-04-01' AND '2015-05-01' LIMIT 10000,10; 日期指数: 107.577秒。

使用日期索引字段的性能提升为: 45.55%!!

所以我想说如果您期望表中有大量数据,请考虑将日期与自己的索引分开。

答案 1 :(得分:25)

我倾向于认为在单独的字段中存储日期和时间基本上没有优势。 MySQL提供了非常方便的函数来提取datetime值的日期和时间部分。

好。可能存在一些效率原因。在MySQL中,您可以在字段上放置单独的索引。因此,例如,如果要搜索特定的,那么按一天中的小时计算的查询(例如)可以使用time字段上的索引。在这种情况下,不会使用datetime字段的索引。单独的date字段可能会更容易编写将使用date索引的查询,但严格来说,datetime也应该有效。

有一次,我看到分开存储的日期和时间是在交易系统中。在这种情况下,交易具有估值日期。评估时间类似于“纽约开放”或“伦敦收盘” - 这不是实时价值。它描述了用于估价的时间。

答案 2 :(得分:0)

棘手的部分是你必须对时间值进行日期算术,而你不希望日期部分进入混合。例如:

myapptdate = 2014-01-02 09:00:00

在2014-01-02 07:00:00和2014-01-02 13:00:00

之间选择这样的地方和myapptdate

1900-01-02 07:00:00 2014-01-02 07:00:00

答案 3 :(得分:0)

我发现的一个不同之处是将BETWEEN用于非零时间的日期。

想象一下使用“日期之间”过滤器进行搜索。标准用户的期望是它也将返回结束日期的记录,因此使用DATETIME您必须始终增加额外的一天才能使BETWEEN正常工作,而使用DATE时您只会传递用户输入,不需要额外的逻辑。

所以查询

SELECT * FROM mytable WHERE mydate BETWEEN '2020-06-24' AND '2020-06-25'

将返回2020-06-25 16:30:00的记录,同时进行查询:

SELECT * FROM mytable WHERE mydatetime BETWEEN '2020-06-24' AND '2020-06-25'

不会-您需要多增加一天的时间:

SELECT * FROM mytable WHERE mydatetime BETWEEN '2020-06-24' AND '2020-06-26'

但是,正如victor diaz所提到的那样,使用date + time进行日期时间计算将是一个效率极低的噩梦,并且比仅在第二个datetime中增加一天要糟糕得多。因此,如果时间不相关,我只会使用DATE,或者将其用作“缓存”以加快查询日期的速度(请参阅Elwin的答案)。