前期数据准备

通过程序往数据库插入 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. 【人人都懂密码学】一篇最易懂的Java密码学入门教程

    密码与我们的生活息息相关,远到国家机密,近到个人账户,我们每天都在跟密码打交道: 那么,密码从何而来?生活中常见的加密是怎么实现的?怎么保证个人信息安全?本文将从这几方面进行浅谈,如有纰漏,敬请各位大 ...

  2. mysql8在生产环境中的配置

    一,配置文件的位置 [root@yjweb ~]# ll /etc/my.cnf -rw-r--r-- 1 root root 935 Mar 11 16:52 /etc/my.cnf 说明:通常我们 ...

  3. matplotlib 饼状图

    import matplotlib.pyplot as plt import matplotlib as mpl # 支持中文 plt.rcParams['font.sans-serif'] = [' ...

  4. CPU 底层运算之乘法运算

    CPU 运算加减法运算 假设计算  3+3  原码是0011 * 0011(以4位存贮单元,因为是原码,最高位不代表符号位) 1. 首先 判断 两个加数是否有 负数(减法)  如果有 负数 先将负数转 ...

  5. CSDN的Markdown编辑器实用技巧(傻瓜式教程)

    markdown编辑器被很多人声称是可以取代word的文字编辑器,其优点我们在这就不再过多赘述了,但对于一些初次接触的人来说,或多或少都有还些不适应,其主要原因在于一些常见的功能突然不知道怎么实现,所 ...

  6. C++学习---单链表的构建及操作

    #include <iostream> using namespace std; typedef struct LinkNode { int elem;//节点中的数据 struct Li ...

  7. mongodb 数据操作CRUD

    链接到mongo 新建超级用户 上文中我们提到mongo用户库表管理.为了方便我们先新建一个root权限的用户. db.createUser({user:'dbadmin',pwd:'123456', ...

  8. cp: cannot stat: filepath Permission denied

    在执行 cp -r frompath topath时,报错cp: cannot stat: frompath Permission denied. 百度,google都没有找到解决方案,无意中发现,原 ...

  9. sentinel控制台的使用

    一,下载sentinel控制台:sentinel-dashboard-1.7.0.jar , 注 1.7.1版本控制台与最新的sentinel有冲突,会报invalid type错误 二,启动sent ...

  10. Lombda表达式(四)

    /* * 自定义函数式接口: * 1.声明一个接口,只能包含一个抽象方法 * 2.给这个接口加@FunctionalInterface */ public class Test { public st ...