10

我们正在编写一个支持 MySQL 的科学工具。问题是,我们的日期时间字段需要微秒精度,而 MySQL 目前不支持。我在这里看到至少两种解决方法:

  • 使用 decimal() 列类型,整数部分对应于某个时间点以来的秒数(我怀疑 UNIX 纪元会这样做,因为我们必须存储在 60 年代和 50 年代进行的测量)。
  • 使用两个整数列,一个用于秒,另一个用于微秒。

最流行的查询是选择与时间间隔相对应的列(即 dt_record > time1 和 dt_record < time2)。

在大型表(数百万行)的情况下,这些方法中的哪一种(或者可能是另一种)可能会提供更好的性能?

4

3 回答 3

5

MySQL 将支持微秒,请参阅MySQL 5.6.4 更改日志

小数秒处理

不兼容的更改:MySQL 现在允许 TIME、DATETIME 和 TIMESTAMP 值的小数秒,精度高达微秒(6 位)。要定义包含小数秒部分的列,请使用语法 type_name(fsp),其中 type_name 是 TIME、DATETIME 或 TIMESTAMP,fsp 是小数秒精度。例如:

创建表 t1 (t TIME(3), dt DATETIME(6)); fsp 值(如果给定)必须在 0 到 6 的范围内。值 0 表示没有小数部分。如果省略,则默认精度为 0。(这与标准 SQL 默认值 6 不同,以便与以前的 MySQL 版本兼容。)

以下项目总结了此更改的影响。另请参见第 10.3.5 节,“时间值中的小数秒”。

于 2012-03-13T09:59:30.570 回答
5

如果您说最流行的查询是时间基准,我建议您使用一个存储时间的列,就像您的第一个选项一样

您可以为应用程序选择自己的时代,然后从那里开始工作。

这应该简化在搜索时间间隔时需要编写的查询。

也看看10.3.1。DATETIME、DATE 和 TIMESTAMP 类型

但是,微秒不能存储到任何时间数据类型的列中。任何微秒部分都将被丢弃。将 TIME 或 DATETIME 值转换为数字形式(例如,通过添加 +0)会产生一个微秒部分为 0.000000 的双精度值

于 2010-02-13T11:45:51.897 回答
0

如何将日期部分拆分为仅日期部分,以及从午夜开始的微秒?一天只有不到 2^64 微秒。然后在 {date, microsecond} 上对表进行聚类。

我猜想,虽然我不知道你的数据,但某些查询在日级精度下会很好——“1964 年的实验”不需要担心微秒。

于 2010-02-13T11:55:47.693 回答