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 07 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 MySQL
MySQL数据库 任意ip连接方法
May 20 MySQL
MySql数据库触发器使用教程
Jun 01 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 MySQL
MySQL新手入门进阶语句汇总
Sep 23 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
openPNE常用方法分享
2011/11/29 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
2016/07/28 PHP
javascript 网页跳转的方法
2008/12/24 Javascript
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
TableSort.js表格排序插件使用方法详解
2017/02/10 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
原生js滑动轮播封装
2020/07/31 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
python根据京东商品url获取产品价格
2015/08/09 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
Python 字符串换行的多种方式
2018/09/06 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
Python利用全连接神经网络求解MNIST问题详解
2020/01/14 Python
小结Python的反射机制
2020/09/28 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
毕业生在校学习的自我评价分享
2013/10/08 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
马智宇结婚主持词
2014/04/01 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
社区服务活动报告
2015/02/05 职场文书
教师个人年度总结
2015/02/11 职场文书
七一建党节慰问信
2015/02/14 职场文书
小学毕业教师寄语
2019/06/21 职场文书
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers