我通常使用datetime字段来存储应用程序中created_time更新的数据时间。
但是现在我遇到了一个数据库表,他们在表中保存了日期和时间字段。
答案 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
之间选择这样的地方和myapptdate1900-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的答案)。