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 相关文章推荐
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
Jul 01 MySQL
MySQL系列之九 mysql查询缓存及索引
Jul 02 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
Nebula Graph解决风控业务实践
Mar 31 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 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生成自己的LOG文件
2006/10/09 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
2007/01/02 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
IE和Firefox下event事件杂谈
2009/12/18 Javascript
JS保存、读取、换行、转Json报错处理方法
2013/06/14 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
jQuery处理XML文件的几种方法
2016/06/14 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
Python变量和数据类型详解
2017/02/15 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Django封装交互接口代码
2020/07/12 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
如何开发安全的AJAX应用
2014/03/26 面试题
初中生自我评价
2014/02/01 职场文书
内勤主管岗位职责
2014/04/03 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
运动会班级口号
2014/06/09 职场文书
2014年安全员工作总结
2014/11/13 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
解约证明模板
2015/06/19 职场文书