Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高

 更新时间:2021年08月21日 11:51:54   作者:哒波甜  
这篇文章主要介绍了Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高,针对这一问题每人回答方式各不相同,下面分享下我的个人想法,需要的朋友可以参考下

数据库中可以用datetime、bigint、timestamp来表示时间,那么选择什么类型来存储时间比较合适呢?

# 后数据准备

通过程序往数据库插入50w数据

数据表:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time_date` datetime NOT NULL,
  `time_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `time_long` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `time_long` (`time_long`),
  KEY `time_timestamp` (`time_timestamp`),
  KEY `time_date` (`time_date`)
) ENGINE=InnoDB AUTO_INCREMENT=500003 DEFAULT CHARSET=latin1

其中time_long、time_timestamp、time_date为同一时间的不同存储格式

实体类users

/**
 * @author hetiantian
 * @date 2018/10/21
 * */
@Builder
@Data
public class Users {
    /**
     * 自增唯一id
     * */
    private Long id;

    /**
     * date类型的时间
     * */
    private Date timeDate;

    /**
     * timestamp类型的时间
     * */
    private Timestamp timeTimestamp;

    /**
     * long类型的时间
     * */
    private long timeLong;
}

dao层接口

/**
 * @author hetiantian
 * @date 2018/10/21
 * */
@Mapper
public interface UsersMapper {
    @Insert("insert into users(time_date, time_timestamp, time_long) value(#{timeDate}, #{timeTimestamp}, #{timeLong})")
    @Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")
    int saveUsers(Users users);
}

测试类往数据库插入数据

public class UsersMapperTest extends BaseTest {
    @Resource
    private UsersMapper usersMapper;

    @Test
    public void test() {
        for (int i = 0; i < 500000; i++) {
            long time = System.currentTimeMillis();
            usersMapper.saveUsers(Users.builder().timeDate(new Date(time)).timeLong(time).timeTimestamp(new Timestamp(time)).build());
        }
    }
}

生成数据代码方至github:https://github.com/TiantianUpup/sql-test/ 如果不想用代码生成,而是想通过sql文件倒入数据,文末附sql文件网盘地址。

# sql查询速率测试

通过datetime类型查询:

select count(*) from users where time_date >="2018-10-21 23:32:44" and time_date <="2018-10-21 23:41:22"

耗时:0.171

通过timestamp类型查询

select count(*) from users where time_timestamp >= "2018-10-21 23:32:44" and time_timestamp <="2018-10-21 23:41:22"

耗时:0.351

通过bigint类型查询

select count(*) from users where time_long >=1540135964091 and time_long <=1540136482372

耗时:0.130s

结论 在InnoDB存储引擎下,通过时间范围查找,性能bigint > datetime > timestamp

# sql分组速率测试


使用bigint 进行分组会每条数据进行一个分组,如果将bigint做一个转化在去分组就没有比较的意义了,转化也是需要时间的

通过datetime类型分组:

select time_date, count(*) from users group by time_date

耗时:0.176s

通过timestamp类型分组:

select time_timestamp, count(*) from users group by time_timestamp

耗时:0.173s

结论 在InnoDB存储引擎下,通过时间分组,性能timestamp > datetime,但是相差不大

# sql排序速率测试

通过datetime类型排序:

select * from users order by time_date

耗时:1.038s

通过timestamp类型排序

select * from users order by time_timestamp

耗时:0.933s

通过bigint类型排序

select * from users order by time_long

耗时:0.775s

结论:在InnoDB存储引擎下,通过时间排序,性能bigint > timestamp > datetime

# 小结

如果需要对时间字段进行操作(如通过时间范围查找或者排序等),推荐使用bigint,如果时间字段不需要进行任何操作,推荐使用timestamp,使用4个字节保存比较节省空间,但是只能记录到2038年记录的时间有限。

文中sql文件网盘地址: 链接: https://pan.baidu.com/s/1cCRCxtTlPriXMERGsbnb_A 提取码: hbq2

到此这篇关于Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高的文章就介绍到这了,更多相关数据库datetime、bigint、timestamp内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL8.0 索引优化invisible index详情

    MySQL8.0 索引优化invisible index详情

    这篇文章主要介绍了MySQL8.0 索引优化invisible index详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • mysql截取的字符串函数substring_index的用法

    mysql截取的字符串函数substring_index的用法

    这篇文章主要介绍了mysql截取的字符串函数substring_index的用法,需要的朋友可以参考下
    2014-08-08
  • mysql覆盖索引的项目实践

    mysql覆盖索引的项目实践

    在MySQL中覆盖索引是一种非常重要的查询优化技术,它的核心思想是一个索引包含了查询所需的所有字段,因此 MySQL 可以直接从索引中获取数据,而无需回表,下面就来详细的介绍一下
    2026-01-01
  • MySQL8新特性:自增主键的持久化详解

    MySQL8新特性:自增主键的持久化详解

    MySQL8.0 GA版本发布了,展现了众多新特性,下面这篇文章主要给大家介绍了关于MySQL8新特性:自增主键的持久化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • MySQL的两种分页方式之Offset/Limit分页和游标分页详解

    MySQL的两种分页方式之Offset/Limit分页和游标分页详解

    这篇文章主要对比了MySQL的Offset/Limit分页与游标分页,指出前者简单但存在数据漂移和性能缺陷,后者通过游标避免这些问题且更高效,建议根据业务场景选择分页方式,深度分页或动态数据宜用游标分页,而延迟联结可优化Offset/Limit性能,需要的朋友可以参考下
    2025-09-09
  • mysql_fetch_row()与mysql_fetch_array()的使用介绍

    mysql_fetch_row()与mysql_fetch_array()的使用介绍

    本篇文章是对mysql_fetch_row()与mysql_fetch_array()的使用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • mysql日常使用中常见报错大全

    mysql日常使用中常见报错大全

    MySQL初学者新安装好数据库及使用过程中经常遇到以下几类错误,本文给大家详细整理并给出完美解决方案,感兴趣的朋友跟随小编一起看看吧
    2023-03-03
  • mysql视图的学习和使用方式

    mysql视图的学习和使用方式

    这篇文章主要介绍了mysql视图的学习和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2016-09-09
  • MySQL笔记之触发器的应用

    MySQL笔记之触发器的应用

    触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句
    2013-05-05
  • Navicat连接不上MySQL的问题解决

    Navicat连接不上MySQL的问题解决

    最近遇到了一件非常棘手的问题,用Navicat远程连接数据库居然连接不到,真是头都大了,下面这篇文章主要给大家介绍了关于Navicat连接不上MySQL的问题解决,需要的朋友可以参考下
    2023-02-02

最新评论