阅读目录

  • 阐述
    • 数据表
    • MySQL 调用存储过程实现批量插入数据
    • sql 查询速率测试
    • sql 分组速率测试
    • sql 排序速率测试
    • 结论
  • MySQL日期函数
    • 1、DATE()
    • 2、TIME()
    • 3、TIMESTAMP()
    • 4、UNIX_TIMESTAMP()

阐述

数据库中可以用 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 ()
BEGINDECLARE i BIGINT DEFAULT 1;WHILE i < 50000001 DOINSERT 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 类型查询:

SELECTcount(*)
FROMusers
WHEREtime_date >= "2022-12-01 23:32:44"
AND time_date <= "2022-12-01 23:41:22"

耗时:0.171

通过 timestamp 类型查询

SELECTcount(*)
FROMusers
WHEREtime_timestamp >= "2018-10-21 23:32:44"
AND time_timestamp <= "2018-10-21 23:41:22"

耗时:0.351

通过 bigint 类型查询

SELECTcount(*)
FROMusers
WHEREtime_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 类型分组:

SELECTtime_timestamp,count(*)
FROMusers
GROUP BYtime_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 设计数据表时,时间类型 datetime、bigint、timestamp MySQL日期函数相关推荐

  1. mysql创建表设置数值范围,MySQL创建数据表时设定引擎MyISAM/InnoDB操作

    我在配置mysql时将配置文件中的默认存储引擎设定为了innodb.今天查看了myisam与innodb的区别,在该文中的第七条"myisam支持gis数据,innodb不支持.即myisa ...

  2. myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法)

    myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法) 参考文章: (1)myeclipse连接mysql生成数据表时中文字符乱码或问号(解决方法) (2)https://www. ...

  3. MySql中的时间类型datetime,timestamp,date,year比较

    MySQL日期类型.日期格式.存储空间.日期范围比较. 日期类型        存储空间       日期格式                 日期范围 ------------ ---------  ...

  4. MySQL创建数据表时设定引擎MyISAM/InnoDB

    我在配置mysql时将配置文件中的默认存储引擎设定为了InnoDB.今天查看了MyISAM与InnoDB的区别,在该文中的第七条"MyISAM支持GIS数据,InnoDB不支持.即MyISA ...

  5. mysql导入数据表大小限制,解除phpMyAdmin导入大型MySQL数据库文件大小限制

    phpMyAdmin 导入大型数据库文件大小限制配置- 1. 修改 php.ini 文件中下列3项的值: upload_max_filesize, memory_limit 和 post_max_si ...

  6. mysql 创建 innodb_MySQL创建数据表时设定引擎MyISAM/InnoDB操作

    我在配置mysql时将配置文件中的默认存储引擎设定为了InnoDB.今天查看了MyISAM与InnoDB的区别,在该文中的第七条"MyISAM支持GIS数据,InnoDB不支持.即MyISA ...

  7. mysqlinnodb教程_MySQL创建数据表时设定引擎MyISAM/InnoDB操作

    我在配置mysql时将配置文件中的默认存储引擎设定为了InnoDB.今天查看了MyISAM与InnoDB的区别,在该文中的第七条"MyISAM支持GIS数据,InnoDB不支持.即MyISA ...

  8. navicat mysql表导入_Navicat for MySQL导入数据表的操作方法

    刚接触Navicat的用户,不清楚Navicat for MySQL怎么导入数据表?现在就跟着小编一起来看一下Navicat for MySQL导入数据表的操作方法吧. Navicat for MyS ...

  9. mysql 数据库时间类型 datetime 数据在页面上显示一串数字, 用函数date_format( )转换格式 ;

    mysql 数据库时间类型 datetime 转换格式 数据库时间字段datetime可以使用date_format( )函数进行时间的转换. 数据库时间字段类型: 数据库查询结果: 没转换前页面显示 ...

最新文章

  1. SAP Cloud Platform创建Destination时Additional properties属性的维护
  2. 重庆大学计算机组成,重庆大学计算机组成原理试题集(含部分答案)
  3. Linux ping命令、Linux kill命令、Linux logname命令、 Linux logout命令
  4. Java转置_Java实现单链表的逆转置
  5. Redis学习---(15)Redis 脚本
  6. 交换机端口配置与管理
  7. 手机app测试用例怎么写?手机app测试点有哪些?只有干货没有水分,错过绝对后悔!
  8. word 插入公式附加右侧编号方法
  9. 联通物联卡为什么没有网络_联通物联卡的资费和优势怎样
  10. [jzoj 4226] 【五校联考3day2】A {简单题}
  11. 魔兽世界 - 宏命令
  12. 计算机视觉实战----AlexNet网络及使用colab跑YoloV5代码
  13. kubernetes入门实战
  14. 满江红--大宋提刑官
  15. 分布式事务常见解决方案
  16. 免费资源和IT常用链接
  17. 如果编程语言是女孩子……
  18. 【胖虎的逆向之路】01——动态加载和类加载机制详解
  19. 爱聊语音聊天室为什么用不了摄像头?
  20. 一阶数字低通滤波器的实现

热门文章

  1. emlog链接html,实现emlog的友情链接只在首页显示
  2. 两类数学归纳法及斐波那契通项的证明
  3. linux做桌面操作系统,我心目中的microsoft(对于普通用户,linux真的适合做桌面操作系统吗)...
  4. 百度地图API实现自动定位城市,省市二联重新地图重新定位
  5. mysql50条必看语句_关于语句大全的10篇文章推荐
  6. EasyExcel动态合并单元格
  7. js实现数据的excel下载
  8. java检查手机号是否被注册_【java】如何开发一个检测手机号注册过哪些网站的应用?...
  9. python中的切片操作
  10. 详解ImageNet 2017夺冠架构SENet