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慢查询的坑
Apr 28 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
MySQL查看表和清空表的常用命令总结
May 26 MySQL
MySQL 时间类型的选择
Jun 05 MySQL
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
Jun 26 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 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适配器模式(Adapter)
2014/11/25 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
js分页代码分享
2014/04/28 Javascript
JQuery实现table行折叠效果以JSON做数据源
2014/05/26 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
分享vue.js devtools遇到一系列问题
2017/10/24 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
Vue axios设置访问基础路径方法
2018/09/19 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
Python中os.path用法分析
2015/01/15 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
Python 转义字符详细介绍
2017/03/21 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
生产厂厂长岗位职责
2013/12/25 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
2014年外联部工作总结
2014/11/17 职场文书
承诺书模板大全
2015/05/04 职场文书
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis