数据库中datetime、bigint、timestamp来表示时间,选择谁来存储时间效率最高呢?
转载于:https://juejin.cn/post/6844903701094596615
后端数据准备
通过程序往数据库插入50w数据
- 数据表
1 | CREATE TABLE `users` ( |
其中time_long、time_timestamp、time_date为同一时间的不同存储格式
- 实体类Users
1 |
|
- Dao层接口
1 |
|
- 测试类往数据库插入数据
1 |
|
SQL查询速率测试
- 通过datetime类型查询
1 | 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类型查询
1 | 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类型查询
1 | select count(*) from users where time_long >=1540135964091 and time_long <=1540136482372 |
耗时:0.130s
结论:在InnoDB存储引擎下,通过时间范围查找,性能bigint > datetime > timestamp
SQL分组速率测试
使用bigint 进行分组会每条数据进行一个分组,如果将bigint做一个转化在去分组就没有比较的意义了,转化也是需要时间的
- 通过datetime类型分组
1 | select time_date, count(*) from users group by time_date |
耗时:0.176s
- 通过timestamp类型分组
1 | select time_timestamp, count(*) from users group by time_timestamp |
耗时:0.173s
结论:在InnoDB存储引擎下,通过时间分组,性能timestamp > datetime,但是相差不大
SQL排序速率测试
- 通过datetime类型排序
1 | select * from users order by time_date |
耗时:1.038s
- 通过timestamp类型排序
1 | select * from users order by time_timestamp |
耗时:0.933s
- 通过bigint类型排序
1 | select * from users order by time_long |
耗时:0.775s
结论:在InnoDB存储引擎下,通过时间排序,性能bigint > timestamp > datetime
总结
如果需要对时间字段进行操作(如通过时间范围查找或者排序等),推荐使用bigint,如果时间字段不需要进行任何操作,推荐使用timestamp,使用4个字节保存比较节省空间,但是只能记录到2038年记录的时间有限。