日期时间 vs 日期和时间 Mysql
Posted
技术标签:
【中文标题】日期时间 vs 日期和时间 Mysql【英文标题】:Datetime vs Date and Time Mysql 【发布时间】:2013-08-21 11:31:44 【问题描述】:我通常使用 datetime 字段来存储应用程序中数据的 created_time 更新时间。
但是现在我遇到了一个数据库表,他们在表中保存了日期和时间单独的字段。
-
那么应该使用其中两个的架构是什么?为什么?
使用两个有什么优缺点?
【问题讨论】:
我正在考虑切换到单独的日期和时间字段。我的情况是,当我知道日期时,我需要能够存储“待定”时间。目前,我使用 12AM 作为“待定”时间的值,但事实证明它比我想要的更麻烦。有没有人遇到过更好的待定时间解决方案?还是我提议的方法工作者对他们更好? 【参考方案1】:在 DATETIME 字段上方使用 DATE 字段时,性能存在巨大差异。我有一个包含超过 4.000.000 条记录的表,出于测试目的,我添加了 2 个字段,它们都有自己的索引。一个使用 DATETIME,另一个使用 DATE。
我禁用了 mysql 查询缓存以便能够正确测试并在同一查询上循环 1000 倍:
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%!!
所以我想说,如果您希望表中有大量数据,请考虑使用自己的索引将日期与时间分开。
【讨论】:
【参考方案2】:我倾向于认为将日期和时间存储在单独的字段中基本上没有任何优势。 MySQL 提供了非常方便的函数来提取 datetime
值的日期和时间部分。
好的。可能有一些效率原因。在 MySQL 中,您可以在字段上放置单独的索引。因此,例如,如果您想搜索特定的次,那么按一天中的小时数计算的查询(例如)可以使用time
字段上的索引。在这种情况下,不会使用datetime
字段上的索引。单独的 date
字段可能更容易编写将使用 date
索引的查询,但严格来说,datetime
也应该可以工作。
我曾在交易系统中看到过单独存储日期和时间的情况。在这种情况下,交易有一个估值日期。估值时间类似于“NY Open”或“London Close”——这不是实时值。它是用于评估的时间的描述。
【讨论】:
【参考方案3】:棘手的部分是当您必须对时间值进行日期算术并且您不希望日期部分进入组合时。例如:
myapptdate = 2014-01-02 09:00:00
选择 myapptdate 介于 2014-01-02 07:00:00 和 2014-01-02 13:00:00 之间的某某
1900-01-02 07:00:00 2014-01-02 07:00:00
【讨论】:
【参考方案4】:我发现的一个区别是使用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
,或者作为“缓存”来加快日期查询的速度(请参阅 Elwin 的回答)。
【讨论】:
以上是关于日期时间 vs 日期和时间 Mysql的主要内容,如果未能解决你的问题,请参考以下文章