平时开发中经常需要记录时间,比如记录某条记录的创建时间和修改时间。有很多方法可以在数据库中存储时间。比如MySQL本身就提供了日期类型,如DATETIME、TIMESTAMEP等,我们也可以直接将时间戳存储为INT类型,也有人直接将时间存储为字符串类型。那么哪种存储时间的方式更好呢?不要使用字符串来存储时间类型。这对初学者来说是一个容易犯的错误。直接将字段设置为VARCHAR类型存储“2021-01-0100:00:00”等字符串很简单。当然,这样做的好处是使用起来比较简单快捷。但是,强烈不推荐这样做,因为这种方式存在两大问题:字符串占用空间大,这种存储字段的比较效率太低。只能逐个字符比较,不能使用MySQL提供的日期API。MySQL中的日期类型MySQL数据库中常见的日期类型有YEAR、DATE、TIME、DATETIME、TIMESTAMEP。因为一般日期需要精确到秒,其中DATETIME、TIMESTAMEP比较合适。DATETIMEDATETIME在数据库中存储的格式为:YYYY-MM-DDHH:MM:SS,占用8个字节。从MySQL5.6开始,DATETIME类型支持毫秒,DATETIME(N)中的N代表毫秒精度。例如,DATETIME(6)表示可以存储6位毫秒。TIMESTAMEPTIMESTAMP实际上存储的是从'1970-01-0100:00:00'到现在的毫秒数。在MySQL中,由于TIMESTAMP类型占用4个字节,其存储时间上限只能达到'2038-01-1903:14:07'。从MySQL5.6开始,TIMESTAMP类型也支持毫秒。与DATETIME不同,TIMESTAMP类型以毫秒为单位占用7个字节,而DATETIME无论是否存储毫秒信息均占用8个字节。TIMESTAMP类型最大的好处就是可以有时区属性,因为它本质上是由毫秒转换而来的。如果你的业务需要对应不同的国家时区,那么TIMESTAMP类型是一个不错的选择。比如在新闻业务中,用户通常想知道新闻发布时自己所在国家的时间,那么TIMESTAMP就是一个选项。Timestamp类型字段的值会随着服务器的时区而变化,会自动转换成对应的时间。简单来说就是在不同时区查询同一条记录时,该字段的值会不同。TIMESTAMP的性能问题TIMESTAMP也存在潜在的性能问题。虽然从毫秒到类型TIMESTAMP的转换本身不需要很多CPU指令,但这不会立即造成性能问题。但是,如果使用默认的操作系统时区,则每次使用时区计算时间都必须调用操作系统的底层系统函数__tz_convert(),并且该函数需要额外的加锁操作来保证操作此时尚未修改系统时区。因此,当大规模并发访问时,会因为资源的热点竞争而出现两个问题:性能不如DATETIME:DATETIME没有时区转换问题。性能抖动:当出现海量并发时,会出现性能抖动问题。要优化TIMESTAMP的使用,建议使用明确的时区而不是操作系统时区。例如在配置文件中明确设置时区,而不是使用系统时区:[mysqld]time_zone="+08:00"简单总结一下这两种数据类型的优缺点:DATETIME存储没有上限时间,而TIMESTAMP存储的时间上限只能到'2038-01-1903:14:07'DATETIME没有时区属性,需要前端或者服务器端处理,只是保存和读取数据来自数据库,性能更好TIMESTAMP有一个时区属性,但是每次都需要通过时区计算时间,在并发访问时会出现性能问题。存储DATETIME比TIMESTAMEP占用更多空间。数字时间戳(INT)很多时候,我们也使用int或bigint值,它们是时间戳。来表示时间。这种存储方式具有Timestamp类型的一些优点,用它来进行日期排序和比较操作会更高效,跨系统也很方便,毕竟它只是一个存储值。缺点也很明显,就是数据的可读性太差,不能直观的看到具体的时间。如果需要查看某个时间段内的数据select*fromtwherecreated_at>UNIX_TIMESTAMP('2021-01-0100:00:00');DATETIMEvsTIMESTAMPvsINT,如何选择?每种方法都有自己的优点。这里简单对比一下这三种方式:TIMESTAMP和INT在本质上是一样的,但是相比较而言,INT虽然对开发友好,但是对DBA和数据分析师就不友好了。可读性差。所以《高性能 MySQL 》的作者推荐TIMESTAMP,因为它的数值更直观的代表了时间。以下为原文:关于时区的问题,可以由前端或者这里的服务做一个转换,不必在数据库中解决。总结本文比较了几种最常用的时间存储方式,个人最推荐DATETIME。原因如下:TIMESTAMP比数字时间戳更具可读性。DATETIME的存储限制是9999-12-3123:59:59。如果使用TIMESTAMP,需要考虑2038年的解决方案DATETIME不需要时区转换,所以性能比TIMESTAMP好如果需要以毫秒为单位存储时间,TIMESTAMP占7个字节,和DATETIME8没有太大区别字节
