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对于模糊查询like的一些汇总
May 09 MySQL
MySQL 分组查询的优化方法
May 12 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
JMeter对MySQL数据库进行压力测试的实现步骤
Jan 22 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
MySQL数据库优化之通过索引解决SQL性能问题
Apr 10 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
MySQL 原理与优化之Update 优化
Aug 14 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
在php中取得image按钮传递的name值
2006/10/09 PHP
我的论坛源代码(四)
2006/10/09 PHP
php判断输入是否是纯数字,英文,汉字的方法
2015/03/05 PHP
php实现简单爬虫的开发
2016/03/28 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
js输出列表实现代码
2010/09/12 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
2013/01/20 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
python字符串加密解密的三种方法分享(base64 win32com)
2014/01/19 Python
python实现排序算法
2014/02/14 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
Python中turtle库的使用实例
2019/09/09 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
python中的插入排序的简单用法
2021/01/19 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
新闻网站实习自我鉴定
2013/09/25 职场文书
两则小学生的自我评价分享
2013/11/14 职场文书
初中生个人学习的自我评价
2013/12/04 职场文书
写演讲稿要注意的六件事
2014/01/14 职场文书
不同意离婚上诉状
2015/05/23 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js