MySQL 设计数据表时,时间类型 datetimebiginttimestamp MySQL日期函数
Posted 知其黑、受其白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 设计数据表时,时间类型 datetimebiginttimestamp MySQL日期函数相关的知识,希望对你有一定的参考价值。
阅读目录
阐述
数据库中可以用 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
mysql 调用存储过程实现批量插入数据
CREATE PROCEDURE tb_option ()
BEGIN
DECLARE i BIGINT DEFAULT 1;
WHILE i < 50000001 DO
INSERT INTO `yiibaidb`.`users` (
`time_date`,
`time_timestamp`,
`time_long`
)
VALUES
(
TIMESTAMP (NOW()),
TIMESTAMP (NOW()),
UNIX_TIMESTAMP(now())
);
SET i = i + 1;
END
WHILE;
COMMIT;
#提交
END;
CALL tb_option ();
sql 查询速率测试
通过 datetime 类型查询:
SELECT
count(*)
FROM
users
WHERE
time_date >= "2022-12-01 23:32:44"
AND time_date <= "2022-12-01 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年记录的时间有限。
MySQL日期函数
1、DATE()
返回 日期。格式:YYYY-MM-DD
SELECT DATE(NOW());
> 2022-04-04
2、TIME()
返回 日期。格式:HH-mm-ss
SELECT TIME(NOW());
> 16:25:09
3、TIMESTAMP()
返回 日期时间。格式:YYYY-MM-DD HH-mm-ss
SELECT TIMESTAMP(NOW());
> 2022-04-04 16:31:12
4、UNIX_TIMESTAMP()
获取日期的时间戳(10位)
SELECT unix_timestamp(now());
> 1649083817
以上是关于MySQL 设计数据表时,时间类型 datetimebiginttimestamp MySQL日期函数的主要内容,如果未能解决你的问题,请参考以下文章
向 mysql 数据库中写入datetime 类型数据时 出现全是0的错误解决办法
mysql建表时怎样设置datetime类型的字段默认值为不自动更新的系统当前时间
Mybatis查询Mysql datetime类型时,相差8小时 解决方案