300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > MySQL数据库时间类型datetime bigint timestamp的查询效率比较

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

时间:2023-07-18 17:46:32

相关推荐

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

以下文章来源方志朋的博客,回复”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明天见(。・ω・。)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。