MySQL 時(shí)間類型 datetime、bigint、timestamp,選哪個(gè)?
數(shù)據(jù)庫中可以用datetime、bigint、timestamp來表示時(shí)間,那么選擇什么類型來存儲(chǔ)時(shí)間比較合適呢?
前期數(shù)據(jù)準(zhǔn)備
數(shù)據(jù)表:
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
實(shí)體類users
/**
* @author hetiantian
* @date 2018/10/21
* */
@Builder
@Data
public class Users {
/**
* 自增唯一id
* */
private Long id;
/**
* date類型的時(shí)間
* */
private Date timeDate;
/**
* timestamp類型的時(shí)間
* */
private Timestamp timeTimestamp;
/**
* long類型的時(shí)間
* */
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);
}
測試類往數(shù)據(jù)庫插入數(shù)據(jù)
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());
}
}
}
sql查詢速率測試
通過datetime類型查詢:
select count(*) from users where time_date >="2018-10-21 23:32:44" and time_date <="2018-10-21 23:41:22"
通過timestamp類型查詢
select count(*) from users where time_timestamp >= "2018-10-21 23:32:44" and time_timestamp <="2018-10-21 23:41:22"
通過bigint類型查詢
select count(*) from users where time_long >=1540135964091 and time_long <=1540136482372
結(jié)論 在InnoDB存儲(chǔ)引擎下,通過時(shí)間范圍查找,性能bigint > datetime > timestamp
sql分組速率測試
通過datetime類型分組:
select time_date, count(*) from users group by time_date
通過timestamp類型分組:
select time_timestamp, count(*) from users group by time_timestamp
結(jié)論 在InnoDB存儲(chǔ)引擎下,通過時(shí)間分組,性能timestamp > datetime,但是相差不大
sql排序速率測試
通過datetime類型排序:
select * from users order by time_date
通過timestamp類型排序
select * from users order by time_timestamp
通過bigint類型排序
select * from users order by time_long
結(jié)論 在InnoDB存儲(chǔ)引擎下,通過時(shí)間排序,性能bigint > timestamp > datetime
小結(jié)
推薦閱讀:
XShell收費(fèi)太貴?快試試開源的NuShell,好用!
你真的會(huì)寫for循環(huán)嗎?來看看這些常見的for循環(huán)優(yōu)化方式
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
朕已閱 

