数据库中可以用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:github.com/TiantianUpu…

如果不想用代码生成,而是想通过sql文件倒入数据,附sql文件网盘地址:pan.baidu.com/s/1Qp9x6z8C…

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年记录的时间有限

datetime mysql 查询_mysql数据库时间类型datetime、bigint、timestamp的查询效率比较相关推荐

  1. mysql 数据库时间类型 datetime 数据在页面上显示一串数字, 用函数date_format( )转换格式 ;

    mysql 数据库时间类型 datetime 转换格式 数据库时间字段datetime可以使用date_format( )函数进行时间的转换. 数据库时间字段类型: 数据库查询结果: 没转换前页面显示 ...

  2. MySQL数据库时间类型datetime、bigint、timestamp的查询效率比较

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:https://juejin.im/post/6844903701094596615 数据库中可以用datetime.bi ...

  3. c mysql数据库函数库查询_Mysql数据库使用concat函数执行SQL注入查询

    SQL注入语句有时候会使用替换查询技术,就是让原有的查询语句查不到结果出错,而让自己构造的查询语句执行,并把执行结果代替原有查询语句查询结果显示出来. 例如:原本查询语句是 select userna ...

  4. job历史执行记录查询 oracle_Oracle数据库定时任务配置和日志执行情况查询

    基础配置: /***************************************************************** * * 移动抵扣券快到期推送提醒 * 首次执行 : 2 ...

  5. MySQL中的日期时间类型与格式化方式

    [1]MySQL中的日期时间类型 MySQL中常用的几种时间类型有:date.datetime.time.year.timestamp 数据类型 占用字节 最小值 最大值 零值表示 date 4 10 ...

  6. MySQL日期数据类型、时间类型使用总结

    转载链接:http://www.jb51.net/article/23966.htm MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ----- ...

  7. 传智播客 mysql视频_MySQL数据库传智播客视频教程【43集】

    教程名称:MySQL数据库传智播客视频教程[43集] 教程目录:[一品资源网]传智播客PHP培训_PHP视频教程 Mysql 第01讲 介绍与安装 [一品资源网]传智播客PHP培训_PHP视频教程 M ...

  8. mysql datetime timestamp 索引_MYSQL中时间类型底层存储,DATETIME ,TIMESTAMP,INT 如何选择?...

    在优化索引时,思考了一个问题,DATE, DATETIME, TIMESTAMP,还有INT存储的时间,在索引中哪个效率更高一些? 索引存储的,如果单纯的测试,而不去了解底层存储的方式和类型就不能断言 ...

  9. MySQL时间字段效率_MYSQL数据库时间字段INT,TIMESTAMP,DATETIME性能效率比较

    正 文: 在数据库设计的时候,我们经常会需要设计时间字段,在MYSQL中,时间字段可以使用int.timestamp.datetime三种类型来存储,那么这三种类型哪一种用来存储时间性能比较高,效率好 ...

最新文章

  1. python学习总目录
  2. NLP中文面试学习资料:面向算法面试,理论代码俱全,登上GitHub趋势榜
  3. java 常用模块_Java 常见面试题的模块
  4. linux操作系统adsl 上网设置,Linux操作系统下ADSL拨号上网详细步骤
  5. toAppendStream doesn‘t support consuming update changes which is produced by node GroupAggregate
  6. handle search in myNote app
  7. wchar_t与char转换(转载)
  8. 微信小程序WXML语法介绍
  9. python中head_Python(Head First)学习笔记:二
  10. 最长k可重区间集问题最长k可重线段集问题
  11. (Zotero)开源的文献管理器 真香
  12. c语言习题 编写自定义函数 volume_c,功能是求正方体的体积(要求:正方体的的边长 a 在主函数中做输入,在主函数中调用函数 volume_c,在主函数中输出正方体体积,a 为int 型变量)。
  13. leo免费的excel操作界面的进销存供你下载使用
  14. leach算法的实现过程_LEACH分簇算法实现和能量控制算法实现
  15. 软考高级 真题 2016年下半年 信息系统项目管理师 案例分析
  16. WPF 控件 (二、按钮)
  17. .NET报错:所生成项目的处理器框架“MSIL”与引用“xxx”的处理器架构“AMD64”不匹配
  18. (翻译)下拉刷新(Pull to refresh)
  19. Esper epl语句详解
  20. SRTM DEM hgt格式转成GRID格式的问题解决

热门文章

  1. poj 3461 Oulipo (KMP)
  2. nagios监控linux主机及服务信息
  3. Golang面向并发的内存模型
  4. 一个 冒泡排序 和 选择排序 的简单c程序
  5. 项目日报模板_新建区重点易涝区能力建设项目2020年11月18日日报
  6. vue项目图片403
  7. 使用 Redis的SETNX命令实现分布式锁
  8. Shiro框架原理及应用分析
  9. 高效实用Kafka-入门介绍
  10. SpringBoot配置@ConfigurationProperties与@Value的区别