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 相关文章推荐
MySQL注入基础练习
May 30 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
MySQL系列之二 多实例配置
Jul 02 MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
Jul 02 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
MySQL创建定时任务
Jan 22 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
单机多实例部署 MySQL8.0.20
May 15 MySQL
MySQL实现字段分割一行转多行的示例代码
Jul 07 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
js类型检查实现代码
2010/10/29 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
[59:32]Liquid vs Fnatic 2019国际邀请赛淘汰赛败者组BO1 8.20.mp4
2020/07/19 DOTA
python中装饰器级连的使用方法示例
2017/09/29 Python
图解Python变量与赋值
2018/04/03 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
详解Django的CSRF认证实现
2018/10/09 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
django实现日志按日期分割
2020/05/21 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
高中自我评价分享
2013/12/05 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
企业安全标语
2014/06/07 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL