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


Posted in MySQL onAugust 23, 2021

数据库中可以用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内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
详解MySQL 联合查询优化机制
May 10 MySQL
MySQL 重写查询语句的三种策略
May 10 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
详解MySQL集群搭建
May 26 MySQL
Mysql数据库手动及定时备份步骤
Nov 07 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
Linux7.6二进制安装Mysql8.0.27详细操作步骤
Nov 27 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 #MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 #MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 #MySQL
MySQL非空约束(not null)案例讲解
Aug 23 #MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 #MySQL
MySQL 1130异常,无法远程登录解决方案详解
Aug 23 #MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 #MySQL
You might like
PHP读书笔记_运算符详解
2016/07/01 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
JavaScript不使用prototype和new实现继承机制
2014/12/29 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
浅谈vue路径优化之resolve
2017/10/13 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
python读取Android permission文件
2013/11/01 Python
Python实现栈的方法
2015/05/26 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
python正则表达式实例代码
2020/03/03 Python
python基于win32api实现键盘输入
2020/12/09 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
专业毕业生个性的自我评价
2013/10/03 职场文书
工程开工庆典邀请函
2014/02/01 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
大学英语专业求职信
2014/06/21 职场文书
购房意向书
2014/08/30 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫