Mysql - 如何决定用 datetime、timestamp、int 哪种类型存储时间戳?

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mysql - 如何决定用 datetime、timestamp、int 哪种类型存储时间戳?

背景


  • 数据表都很可能会有一两个字段需要保存日期时间数据,那应该用什么 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数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
关系型数据库 MySQL 数据库
Mysqlbug-Could not create or access the registry key needed for the MySQL applicationto, TIMESTAMP w
Mysqlbug-Could not create or access the registry key needed for the MySQL applicationto, TIMESTAMP w
|
13天前
|
存储 关系型数据库 MySQL
|
29天前
|
JSON 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在使用CDAS语法同步MySQL数据到Hologres时,如果开启了字段类型宽容模式,MySQL中的JSON类型会被转换为什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI产品使用合集之int类型是否可以为raw feature
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
17天前
|
关系型数据库 MySQL
mysql查询结果时间戳转成日期格式——date、DATE_FORMAT和FROM_UNIXTIME的使用
mysql查询结果时间戳转成日期格式——date、DATE_FORMAT和FROM_UNIXTIME的使用
18 0
|
19天前
|
存储 JSON 关系型数据库
MySQL JSON 类型:功能与应用
MySQL JSON 类型:功能与应用
|
24天前
|
存储 Java 关系型数据库
数据类型的取值范围以及Java和Mysql数据库的类型对照--强调时间类型的转换(jdk1.8)
数据类型的取值范围以及Java和Mysql数据库的类型对照--强调时间类型的转换(jdk1.8)
20 0
|
2月前
|
数据采集 分布式计算 数据处理
Dataphin常见问题之与指定类型int不兼容如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
2月前
|
SQL 流计算 OceanBase
OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
【2月更文挑战第25天】OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
59 3
|
1月前
|
运维 Cloud Native 关系型数据库
云原生数据仓库AnalyticDB产品使用合集之布尔类型和int类型可以自动转换吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
128 1