zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

MySQL 设计数据表时,时间类型 datetime、bigint、timestamp MySQL日期函数

mysql日期 函数 设计 时间 类型 数据表 datetime
2023-09-11 14:14:56 时间

阐述

数据库中可以用 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