前期数据准备

通过程序往数据库插入 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 文件网盘地址:https://pan.baidu.com/s/1Qp9x6z8CN6puGfg-eNghig

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

MySQL时间类型datetime、bigint及timestamp的查询效率的更多相关文章

  1. mysql 时间类型datetime与timestamp区别比较

    mysql 时间类型datetime与timestamp区别比较 相同点: 显示宽度和格式相同,显示宽度固定在19字符,格式为YYYY-MM-DD HH:MM:SS. 不同点: (1)时间范围不同: ...

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

    MySQL:MySQL日期数据类型.MySQL时间类型使用总结 MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ------------ --- ...

  3. mysql 时间类型分类

    MySQL:MySQL日期数据类型.MySQL时间类型使用总结 MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围------------ ---- ...

  4. MySQL 时间类型字段的分析

    日期类型                存储空间               日期格式                                           日期范围---------- ...

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

    MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间      日期格式                日期范围------------  -------- ...

  6. mysql时间类型和格式转换

    内容目录 简介mysql时间类型DATE_FORMAT()函数 简介 今天开发中,做一个功能需要对历史数据进行补充,相信大家也遇到过这样的情况,这个历史数据需要按月份和人的id进行区分,于是想到了my ...

  7. MVC3学习:Sql Server2005中时间类型DateTime的显示

    在Sql Server2005中,如果将某字段定义成日期时间类型DateTime,那么在视图中会默认显示成年月日时分秒的方式(如 2013/8/6 13:37:33) 如果只想显示成年月日形式,不要时 ...

  8. SQL Server时间类型datetime

    SQL Server时间类型datetime 兼容ADO的COleDateTime. SQL datetime 日期和时间数据,可表示1753.1.1 至 9999.12.31的时间,精度为1/300 ...

  9. mysql中时间类型datetime,timestamp与int的区别

    在mysql中存储时间,我们可以用datetime 格式,timestamp格式,也可以用int格式.那么我们设计的时候该如何考虑呢? 首先,我觉得应该明白这几个格式究竟是如何的,然后看看他们的区别, ...

随机推荐

  1. MeteoInfoLab脚本示例:OMI Grid HDF数据

    OMI卫星格点数据的例子,全球臭氧柱总量分布.脚本程序: #Add data file folder = 'D:/Temp/hdf/' fns = 'OMI-Aura_L3-OMTO3e_2005m1 ...

  2. MeteoInfoLab脚本示例:站点数据散点图

    这里演示从micaps第一类数据(地面全要素观测)中读取一个变量(用DimDataFile类的stationdata方法),然后maskout掉中国区域之外的数据,利用scatterm函数绘制散点图. ...

  3. 【最大匹配+二分答案】POJ 3057 Evacuation

    题目大意 POJ链接 有一个\(X×Y\)的房间,X代表墙壁,D是门,.代表人.这个房间着火了,人要跑出去,但是每一个时间点只有一个人可以从门出去. 问最后一个人逃出去的最短时间,如果不能逃出去,输出 ...

  4. k8s-命令创建service

    查看命令帮助 [root@master kubernetes]# kubectl create service -h Create a service using specified subcomma ...

  5. centOS7 查看防火墙状态 开放端口

    一.防火墙的开启.关闭.禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:systemctl disable fire ...

  6. java并发编程与多线程基础学习一

    学习url:https://www.cnblogs.com/lixinjie/p/10817860.html https://www.cnblogs.com/JJJ1990/p/10496850.ht ...

  7. robotframework执行UI自动化时不能运行谷歌浏览器的问题

    robotframework执行UI自动化时报错,查看日志显示Parent suite setup failed: Variable '${browser}' not found. Did you m ...

  8. EasyExcel使用心得

    最近项目中用到了阿里easyExcel做导入导出功能 下面是我写的一个工具类,带泛型的.拿来即用,有需求的小伙伴可以看看. 同时也欢迎大佬提出修改意见. 一.首先先写一个生成Excel表头的DTO类, ...

  9. Java技术平台介绍

    Java的名字的来源:Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关, 如JavaBeans(咖啡豆).NetBeans(网络豆)以及ObjectB ...

  10. 4-Kotlin数据类型与变量

    一. 变量概念 在Kotlin中变量其实对应着内存中特定区域,变量就像是一个装"数据"的容器 1 val num1:Int = 100 2 var num2:Int = 99 关键 ...