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类型的字段默认值为不自动更新的系统当前时间

MySQL数据类型 - 日期和时间类型

Mybatis查询Mysql datetime类型时,相差8小时 解决方案

mybatis查询mysql的datetime类型数据时间差了14小时

mybatis查询mysql的datetime类型数据时间差了14小时