我通常使用 datetime 字段来存储应用程序中数据的 created_time 更新时间。
但是现在我遇到了一个数据库表,他们在表中保存了日期和时间单独的字段。
- 那么应该使用其中两个的模式是什么,为什么?
- 使用两个有什么优点和缺点?
我通常使用 datetime 字段来存储应用程序中数据的 created_time 更新时间。
但是现在我遇到了一个数据库表,他们在表中保存了日期和时间单独的字段。
在 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%!!
所以我想说,如果您希望表中有大量数据,请考虑使用自己的索引将日期与时间分开。
我倾向于认为将日期和时间存储在单独的字段中基本上没有任何优势。MySQL 提供了非常方便的函数来提取值的日期和时间部分datetime
。
好的。可能有一些效率原因。在 MySQL 中,您可以在字段上放置单独的索引。因此,例如,如果您想搜索特定时间,那么按一天中的小时数计算的查询(例如)可以使用该time
字段上的索引。datetime
在这种情况下,不会使用字段上的索引。单独的date
字段可能更容易编写将使用date
索引的查询,但严格来说,adatetime
也应该工作。
有一次我看到单独存储的日期和时间是在交易系统中。在这种情况下,交易有一个估值日期。估值时间类似于“NY Open”或“London Close”——这不是实时值。它是对用于估值的时间的描述。
棘手的部分是当您必须对时间值进行日期算术并且您不希望日期部分进入组合时。前任:
我的应用日期 = 2014-01-02 09:00:00
在 2014-01-02 07:00:00 和 2014-01-02 13:00:00 之间选择这样那样的地方
1900-01-02 07:00:00 2014-01-02 07:00:00
我发现的一个区别是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'
但正如维克多·迪亚兹所提到的,使用日期+时间进行日期时间计算将是一场超级低效的噩梦,而且比仅仅在第二个日期时间上增加一天还要糟糕得多。因此,我只会DATE
在时间无关紧要的情况下使用,或者作为“缓存”来加快日期查找的查询速度(请参阅 Elwin 的回答)。