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 角色(role)功能介绍
Apr 24 MySQL
MySQL 全文索引使用指南
May 25 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
MySQL 开窗函数
Feb 15 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
优化Mysql查询的示例
Apr 26 MySQL
mysql 子查询的使用
Apr 28 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 MySQL
MySQL聚簇索引和非聚簇索引的区别详情
Jun 14 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL中dd::columns表结构转table过程及应用详解
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
我的论坛源代码(二)
2006/10/09 PHP
PHP 采集心得技巧
2009/05/15 PHP
php实现单链表的实例代码
2013/03/22 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
详细讲解JS节点知识
2010/01/31 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
值得分享和收藏的xmlplus组件学习教程
2017/05/05 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
详解K-means算法在Python中的实现
2017/12/05 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
Django urls.py重构及参数传递详解
2019/07/23 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
会议室标语
2014/06/21 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
Go语言应该什么情况使用指针
2021/07/25 Golang