以下文章来源方志朋的博客,回复”666“获面试宝典
来源:https://juejin.im/post/6844903701094596615
数据库中可以用datetime、bigint、timestamp来表示时间,那么选择什么类型来存储时间比较合适呢?
前期数据准备
通过程序往数据库插入50w数据
数据表:
CREATETABLE`users`(`id`int(11)NOTNULLAUTO_INCREMENT,`time_date`datetimeNOTNULL,`time_timestamp`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,`time_long`bigint(20)NOTNULL,PRIMARYKEY(`id`),KEY`time_long`(`time_long`),KEY`time_timestamp`(`time_timestamp`),KEY`time_date`(`time_date`))ENGINE=InnoDBAUTO_INCREMENT=500003DEFAULTCHARSET=latin1
其中time_long、time_timestamp、time_date为同一时间的不同存储格式
实体类users
/***@authorhetiantian*@date/10/21**/@Builder@DatapublicclassUsers{/***自增唯一id**/privateLongid;/***date类型的时间**/privateDatetimeDate;/***timestamp类型的时间**/privateTimestamptimeTimestamp;/***long类型的时间**/privatelongtimeLong;}
dao层接口
/***@authorhetiantian*@date/10/21**/@MapperpublicinterfaceUsersMapper{@Insert("insertintousers(time_date,time_timestamp,time_long)value(#{timeDate},#{timeTimestamp},#{timeLong})")@Options(useGeneratedKeys=true,keyProperty="id",keyColumn="id")intsaveUsers(Usersusers);}
测试类往数据库插入数据
publicclassUsersMapperTestextendsBaseTest{@ResourceprivateUsersMapperusersMapper;@Testpublicvoidtest(){for(inti=0;i<500000;i++){longtime=System.currentTimeMillis();usersMapper.saveUsers(Users.builder().timeDate(newDate(time)).timeLong(time).timeTimestamp(newTimestamp(time)).build());}}}
sql查询速率测试
通过datetime类型查询:
selectcount(*)fromuserswheretime_date>="-10-2123:32:44"andtime_date<="-10-2123:41:22"
耗时:0.171
通过timestamp类型查询
selectcount(*)fromuserswheretime_timestamp>="-10-2123:32:44"andtime_timestamp<="-10-2123:41:22"
耗时:0.351
通过bigint类型查询
selectcount(*)fromuserswheretime_long>=1540135964091andtime_long<=1540136482372
耗时:0.130s
结论 在InnoDB存储引擎下,通过时间范围查找,性能bigint > datetime > timestamp
sql分组速率测试
使用bigint 进行分组会每条数据进行一个分组,如果将bigint做一个转化在去分组就没有比较的意义了,转化也是需要时间的
通过datetime类型分组:
selecttime_date,count(*)fromusersgroupbytime_date
耗时:0.176s
通过timestamp类型分组:
selecttime_timestamp,count(*)fromusersgroupbytime_timestamp
耗时:0.173s
结论 在InnoDB存储引擎下,通过时间分组,性能timestamp > datetime,但是相差不大
sql排序速率测试
通过datetime类型排序:
select*fromusersorderbytime_date
耗时:1.038s
通过timestamp类型排序
select*fromusersorderbytime_timestamp
耗时:0.933s
通过bigint类型排序
select*fromusersorderbytime_long
耗时:0.775s
结论 在InnoDB存储引擎下,通过时间排序,性能bigint > timestamp > datetime
小结
如果需要对时间字段进行操作(如通过时间范围查找或者排序等),推荐使用bigint,如果时间字段不需要进行任何操作,推荐使用timestamp,使用4个字节保存比较节省空间,但是只能记录到2038年记录的时间有限
在这里,我为大家准备了一份最新最全的《史上最简单的java面试题》,这套电子书涵盖了诸多java技术栈的面试知识题,是作者面试BAT大厂的前的总结,作者顺利拿下AT的offer,相信可以帮助大家在最短的时间内复习Java后端的大多数面试题,从而拿到自己心仪的offer。截了张图,大家可以仔细查看左边的菜单栏,覆盖的知识面真的很广,而且质量都很不错。资料获取方法扫描下方二维码后台回复关键词:BAT明天见(。・ω・。)