在MySQL中存储微秒:使用哪种解决方法?

10
我们正在编写一个带有MySQL支持的科学工具。问题是,我们需要微秒级别的精度来处理日期时间字段,而MySQL目前不支持此功能。我至少看到两种解决方法:
  • 使用decimal()列类型,整数部分对应于自某个时刻以来的秒数(我怀疑UNIX纪元将无法胜任,因为我们必须存储在60年代和50年代采取的测量值)。
  • 使用两个整数列,一个用于秒数,另一个用于微秒数。

最流行的查询是选择与时间间隔对应的列(即dt_record> time1 and dt_record & lt; time2)。

在大型表格(数百万行)的情况下,哪一种方法(或可能是其他方法)能够提供更好的性能?

3个回答

5
如果您说最受欢迎的查询是基于时间的话,我建议选择单列存储时间,就像您第一个选项中所示。您可以为应用程序选择自己的时代,并从那里开始。这将简化搜索时间间隔时需要编写的查询。还要查看 10.3.1. DATETIME、DATE 和 TIMESTAMP 类型。但是,微秒无法存储在任何时间数据类型的列中。任何微秒部分都将被丢弃。将 TIME 或 DATETIME 值转换为数字形式(例如,通过添加 +0)会导致具有 .000000 微秒部分的 double 值。

5
MySQL现在支持微秒级别,具体请参见MySQL 5.6.4变更日志
分数秒处理
不兼容更改:MySQL现在允许TIME、DATETIME和TIMESTAMP值的小数秒部分,精度高达微秒(6位)。要定义包含小数秒部分的列,请使用语法type_name(fsp),其中type_name是TIME、DATETIME或TIMESTAMP,fsp是小数秒精度。例如: CREATE TABLE t1 (t TIME(3), dt DATETIME(6)); 如果给出fsp值,则必须在0到6的范围内。值为0表示没有小数部分。如果省略,则默认精度为0。(这与标准SQL默认值6不同,以保证与之前的MySQL版本兼容性)。
以下项目总结了此更改的影响。另请参阅第10.3.5节“时间值中的小数秒”。

0
如何将日期部分拆分为仅包含日期的部分和距午夜的微秒数?一天内的微秒数不到2^64。然后在{日期,微秒}上对表进行聚类。
我猜,虽然我不知道你的数据,但某些查询可以使用日级别的精度——“1964年的实验”不需要担心微秒。

典型的查询需要从一开始就具备分钟级别的精度,这意味着查询将需要在其where子句中使用两个列,据我所知,这将明显影响性能。 - dpq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接