背景

  • 数据表都很可能会有一两个字段需要保存日期时间数据,那应该用什么 Mysql 类型来保存呢?
  • 前面讲过 datetime、timestamp、int 的方式来保存日期时间

如何存储 10位、13位的 unix 时间戳?

date、datetime、timestamp 的区别

本篇文章会对 datetime、timestamp、int 进行比较,然后对一些典型的查询进行基准测试,来决定什么情况下使用哪种数据类型

整体对比表

加粗是缺点

Feature

datetime

timestamp

Int (存储 Unix time)

本地时间表示

Yes

Yes

No,如果要表示为本地时间需要借助转换函数,比如FROM_UNIXTIME()

存储小数秒

Yes,高达 6 位精度

Yes,高达 6 位精度

No

有效范围

'1000-01-01 00:00:00.000000'
to
'9999-12-31 23:59:59.999999

'1970-01-01 00:00:01.000000'
to
'2038-01-19 03:14:07.999999'

如果是无符号,
'1970-01-01 00:00:01.000000;
理论上可到
'2106-2-07 06:28:15'

自动初始化 (MySQL 5.6.5+)

Yes

Yes

No

可读性好

Yes

Yes

No, 必须转换才能知道具体时间点

存储时间值会转换为 UTC 时间

No

Yes

No

可以改成其他了诶性

Yes,

如果结果值在有效时间范围内

Yes

Yes, 如果结果值在有效时间范围内并使用了转换函数

存储要求

(MySQL 5.6.4+)

5 bytes (加上最多 3 个字节的小数秒,如果使用)

4 bytes(加上最多 3 个字节的小数秒,如果使用)

4 bytes (no fractional seconds allowed)

 

接下来对 int、timestamp、datetime 的性能进行基准测试

  • 这里直接展示结果,不展示过程了(因为只需要关注结果即可)
  • 感兴趣可以看:https://vertabelo.com/blog/
  • 这里会使用 sysbench、mysqlslap 两个性能测试工具

测试一:选择日期范围内的值

下列查询均是从 1,497,421 个可用数据中返回 75,706 行

datetime

SELECT SQL_NO_CACHE
measured_on
FROM
vertabelo.datetimemeasures m
WHERE
m.measured_on > '2016-01-01 00:00:00.0'
AND m.measured_on < '2016-02-01 00:00:00.0';
Response time (ms) Sysbench mysqlslap
Min 152 296
Max 1261 3203
Average 362 809

timestamp

SELECT SQL_NO_CACHE
measured_on
FROM
vertabelo.timestampmeasures m
WHERE
m.measured_on > '2016-01-01 00:00:00.0'
AND m.measured_on < '2016-02-01 00:00:00.0'; 
Response time (ms) Sysbench mysqlslap
Min 214 359
Max 1389 3313
Average 431 1004

int(使用 FROM_UNIXTIME 转换函数)

SELECT SQL_NO_CACHE
measured_on
FROM
vertabelo.inttimestampmeasures m
WHERE
FROM_UNIXTIME(m.measured_on) > '2016-01-01 00:00:00.0'
AND FROM_UNIXTIME(m.measured_on) < '2016-02-01 00:00:00.0';
Response time (ms) Sysbench mysqlslap
Min 2472 7968
Max 6554 10312
Average 4107 8527

int

SELECT SQL_NO_CACHE
measured_on
FROM
vertabelo.inttimestampmeasures m
WHERE
m.measured_on > 1451617200
AND m.measured_on < 1454295600;
Response time (ms) Sysbench mysqlslap
Min 88 171
Max 275 2157
Average 165 514

结论

  • 两个基准测试工具都表明 datime 比 timestamp 和 int(使用转换函数) 快
  • 但是 datetime 并不比直接用 int 数字快
Avg response time (ms) Sysbench 相对于 datetime 的速度 mysqlslap 相对于 datetime 的速度
datetime 362 - 809 -
timestamp 431 19% slower 1004 24% slower
int(使用转换函数) 4107 1134% slower 8527 1054% slower
int 165 55% faster 514 36% faster

测试二:选择星期一的数据

下列查询均是从 1,497,421 个可用数据中返回 221,850 行

datetime

SELECT SQL_NO_CACHE measured_on
FROM
vertabelo.datetimemeasures m
WHERE
WEEKDAY(m.measured_on) = 0 #MONDAY;
Response time (ms) Sysbench mysqlslap
Min 1874 4343
Max 6168 7797
Average 3127 6103

timestamp

SELECT SQL_NO_CACHE
measured_on
FROM
vertabelo.timestampmeasures m
WHERE
WEEKDAY(m.measured_on) = 0 #MONDAY;
Response time (ms) Sysbench mysqlslap
Min 2688 5953
Max 6666 13531
Average 3653 8412

int(使用 FROM_UNIXTIME 转换函数)

SELECT SQL_NO_CACHE
measured_on
FROM
vertabelo.inttimestampmeasures m
WHERE
WEEKDAY(FROM_UNIXTIME(m.measured_on)) = 0 #MONDAY;
Response time (ms) Sysbench mysqlslap
Min 2051 5844
Max 7007 10469
Average 3486 8088

结论

  • 两个基准测试工具都表明 datime 比 timestamp 和 int(使用转换函数) 快
  • 但在这个测试中,int(使用转换函数)比 timestamp 更快
Avg response time (ms) Sysbench 相对于 datetime 的速度 mysqlslap 相对于 datetime 的速度
Datetime 3127 - 6103 -
Timestamp 3653 17% slower 8412 38% slower
INT 3486 11% slower 8088

32% slower

测试三:统计星期一的数据量

下列查询均是从 1,497,421 个可用数据中返回 1 行

datetime

SELECT SQL_NO_CACHE
COUNT(measured_on)
FROM
vertabelo.datetimemeasures m
WHERE
WEEKDAY(m.measured_on) = 0 #MONDAY;
Response time (ms) Sysbench mysqlslap
Min 1720 4063
Max 4594 7812
Average 2797 5540

timestamp

SELECT SQL_NO_CACHE
COUNT(measured_on)
FROM
vertabelo.timestampmeasures m
WHERE
WEEKDAY(m.measured_on) = 0 #MONDAY;
Response time (ms) Sysbench mysqlslap
Min 1907 4578
Max 5437 10235
Average 3408 7102

int(使用 FROM_UNIXTIME 转换函数)

SELECT SQL_NO_CACHE
COUNT(measured_on)
FROM
vertabelo.inttimestampmeasures m
WHERE
WEEKDAY(FROM_UNIXTIME(m.measured_on)) = 0 #MONDAY;
Response time (ms) Sysbench mysqlslap
Min 2108 5609
Max 4764 9735
Average 3307 7416

结论

  • 两个基准测试工具都表明 datime 比 timestamp 和 int(使用转换函数) 快
  • 但在这个测试中,int(使用转换函数)比 timestamp 更快
Avg response time (ms) Sysbench 相对于 datetime 的速度 mysqlslap 相对于 datetime 的速度
Datetime 2797 - 5540 -
Timestamp 3408 22% slower 7102 28% slower
INT 3307 18% slower 7416 33% slower

最终结论

使用 datetime 应该是绝大多数场景下的最佳选择,因为

  • 它更快
  • 它可读性更好,无需转换
  • 没有时区切换的问题
  • 它仅比 timestamp 多使用 1 个字节,但存储的时间范围却非常大

做抉择

  • 如果只是想存储简单的 unix 时间戳,那么使用 int 是最佳选择,因为它非常快,和使用普通数字一样
  • 而如果要根据时区进行存储日期时间,那么就应该使用 timestamp
  • 否则绝大多数情况下推荐使用  datetime
 

Mysql - 如何决定用 datetime、timestamp、int 哪种类型存储时间戳?的更多相关文章

  1. Mysql 实战关于date,datetime,timestamp类型使用

    最近在做一个项目 项目中 不同的小伙伴同时在不同的业务模块中用到了date,datetime,timestamp这三个类型 特别是datetime,timestamp这两个 如果不能理解到位  其实很 ...

  2. mysql中tinyint、smallint、int和bigint类型的用法区别

    mysql中tinyint.smallint.int和bigint类型的用法区别: 在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127.无符号的范围是0到255(见官 ...

  3. Mysql时间存储类型优缺点?DATETIME?TIMESTAMP?INT?

    TIMESTAMP 4个字节储存;值以UTC格式保存;.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区. DATETIME 8个字节储存;实际格式储存;与时区无关;datetime  ...

  4. Mysql中date,time,datetime,timestamp的区别

    区别: timestamp:时间戳.北京时间1970年01月01日08时00分00秒 起至现在的总秒数. datetime:带时分秒的完整时间,例如:1970-01-01 10:00:00 date: ...

  5. DateTime?,也是一种类型,代表DateTime或NULL两种类型,在处理空时间时比较有用

    public static DateTime? GetDateTimeFromStr(string date) { if (date.Trim() == string.Empty) return nu ...

  6. mysql中float、double、decimal三种类型,以及数值产生误差的原因

    单精度浮点数用4字节(32bit)表示浮点数,采用IEEE754标准的计算机浮点数,在内部是用二进制表示的,如:7.22用32位二进制是表示不下的,所以就导致不精确了,存取会出现误差. mysql中f ...

  7. 简述MySQL数据库中的Date,DateTime,TimeStamp和Time类型

    DATETIME类型 定义同时包含日期和时间信息的值时.MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,支持的范围是'1000-01-01 00:00:00' ...

  8. mysql5.6 TIME,DATETIME,TIMESTAMP

    [背景] 5.6.4以后时间类型(TIME,DATETIME,TIMESTAMP)支持微秒 DATETIME范围 :'1000-01-01 00:00:00.000000' to '9999-12-3 ...

  9. Mysql 5.7 系列命令 timestamp类型的字段不能设默认值为“0000-00-00 00:00:00” 要设为`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新',

    一.show相关命令语句 1.查看表的索引 show index from tbl_name; 1 table:表名 non_unique:索引是非唯一的?.0否,唯一是索引的.1是,是非唯一索引.( ...

随机推荐

  1. Javascript 常见的高阶函数

    高阶函数,英文叫 Higher Order function.一个函数可以接收另外一个函数作为参数,这种函数就叫做高阶函数. 示例: function add(x, y, f) { return f( ...

  2. Python:安装opencv出现错误Could not find a version that satisfies the requirement numpy==1.13.3 (from versions: 1.14.5, 1.14.6, 1.15.0rc2, 1.15.0, 1.15.1, 1.15.2, 1.15.3, 1.15.4, 1.16.0rc1, 1.16.0rc2,

    安装opencv的时候,出现numpy的版本不匹配,卸载了不匹配的版本,重新安装却是一点用都没有,后面尝试了一下这里的提示pip更新,居然安装成功了,看来pip的版本过低真是误事啊. 报错是: Cou ...

  3. 安装SpaCy出现报错:requests.exceptions.ConnectionError: HTTPSConnectionPool(host='raw.githubusercontent.com', port=443):

    内含安装步骤及报错解决:https://www.cnblogs.com/xiaolan-Lin/p/13286885.html

  4. windows下将Anaconda移位置(C盘转移至D盘)

    1.首先说明一下我的安装情况: (1)Window10系统 (2)Anaconda安装在C盘 2.由于Anaconda安装在C盘经常会涉及权限问题,在安装torch的时候让我萌发了转移磁盘的想法(拒绝 ...

  5. 浅谈机(J)惨(C)技巧——从入门到精通(?)

    JC总是无聊的机房中有意思的一个瞬间... 比如: 这个杰作由 ZSWBWYX 完成 你认为这只是AK-IOI吗?不!注意用户名...也是此人的杰作. 所以,在险恶的机房里,一定要保护好自己的账号. ...

  6. Win10连WiFi显示无internet,安全 却可以正常上网

    1.现象: win10连WiFi显示无internet,安全 可以正常上网 2.原因: Wind10升级系统补丁后,更新了系统检查是否联网的注册表配置,新的域名在国内存在无法连接情况.导致此问题发生 ...

  7. IPtable防火墙概念介绍

    1.iptables安全优化 1.不配外网,做代理转发或者防火墙映射 2.并发过大,不建议开启防火墙 2.防火墙的工作流程: 按照配置规则的顺序自上而下,从前到后进行过滤 如果匹配上新规则,表明是阻止 ...

  8. 4 个场景揭秘,如何低成本让容器化应用 Serverless 化?

    作者 | changshuai FaaS 的门槛 Serverless 形态的云服务帮助开发者承担了大量复杂的扩缩容.运维.容量规划.云产品打通集成等责任,使得开发者可以专注业务逻辑.提高交付速度 ( ...

  9. SpringCloud升级之路2020.0.x版-28.OpenFeign的生命周期-进行调用

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 接下来,我们开始分析 OpenFeign 同步环境下的生命周期的第二部分,使用 Synch ...

  10. 靶场渗透CH4INRULZ_v1.0.1

    最新文章见我个人博客:点此 靶机环境下载地址:[下载] ova下载下来后直接导入virtualbox即可(https://www.vulnhub.com/entry/ch4inrulz-101,247 ...