文档章节

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

o
 osc_off5houl
发布于 07/01 12:12
字数 745
阅读 65
收藏 0

精选30+云产品,助力企业轻松上云!>>>

数据库中可以用 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 年记录的时间有限。




o
粉丝 0
博文 59
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
MySQL时间类型datetime、bigint及timestamp的查询效率

问题:数据库中可以用 datetime、bigint、timestamp 来表示时间,那么选择什么类型来存储时间比较合适呢? 前期数据准备 通过程序往数据库插入 50w 数据 其中 timelong、timetimestamp、tim...

木九天
07/08
23
0
mysql数据库时间类型datetime、bigint、timestamp的查询效率比较

数据库中可以用 datetime、bigint、timestamp 来表示时间,那么选择什么类型来存储时间比较合适呢? 前期数据准备 通过程序往数据库插入 50w 数据 数据表: 其中 timelong、timetimestamp、t...

Myname。
06/30
0
0
mysql数据库时间类型datetime、bigint、timestamp的查询效率比较

数据库中可以用 datetime、bigint、timestamp 来表示时间,那么选择什么类型来存储时间比较合适呢? 前期数据准备 通过程序往数据库插入 50w 数据 数据表: 其中 timelong、timetimestamp、t...

Java技术剑
06/28
0
0
mysql数据库时间类型datetime、bigint、timestamp的查询效率比较

数据库中可以用 datetime、bigint、timestamp 来表示时间,那么选择什么类型来存储时间比较合适呢? 前期数据准备 通过程序往数据库插入 50w 数据 数据表: 其中 timelong、timetimestamp、t...

osc_47pscir3
06/29
5
0
mysql数据库时间类型datetime、bigint、timestamp的查询效率比较

数据库中可以用 datetime、bigint、timestamp 来表示时间,那么选择什么类型来存储时间比较合适呢? 前期数据准备 通过程序往数据库插入 50w 数据 数据表: 其中 timelong、timetimestamp、t...

osc_t6qz550e
06/29
6
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka如何在千万级别时优化JVM GC问题?

大家都知道Kafka是一个高吞吐的消息队列,是大数据场景首选的消息队列,这种场景就意味着发送单位时间消息的量会特别的大,那既然如此巨大的数据量,kafka是如何支撑起如此庞大的数据量的分发...

hummerstudio
06/18
6
0
我打赌!90%程序员都破解不了这个粽子,不信你试!

放假了 各位读者朋友们,马上就是端午小长假啦,开心激动有木有? 新的故事文章还在创作中,写了初稿感觉不太满意又推倒重来。其实写故事还是挺难的,读者可能第一次第二次有新鲜感,写多了就...

轩辕之风
06/24
20
0
如何删库跑路?教你使用Binlog日志恢复误删的MySQL数据

前言 “删库跑路”是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路! 开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你能够了解...

后端技术漫谈
01/14
22
0
PHP设计模式之代理模式

PHP设计模式之代理模式 代理人这个职业在中国有另外一个称呼,房产经济人、保险经济人,其实这个职业在国外都是叫做房产代理或者保险代理。顾名思义,就是由他们来帮我们处理这些对我们大部分...

硬核项目经理
2019/09/23
7
0
Redis的复制模式

Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作。 同步 同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。 1. 旧版本的执行步骤 从服务器...

osc_s9cni3go
25分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部