正 文:

在数据库设计的时候,我们经常会需要设计时间字段,在MYSQL中,时间字段可以使用int、timestamp、datetime三种类型来存储,那么这三种类型哪一种用来存储时间性能比较高,效率好呢?飘易就这个问题,来一个实践出真知吧。

MYSQL版本号:5.5.19

建立表:CREATE TABLE IF NOT EXISTS `datetime_test` (

`id` int(11) NOT NULL,

`d_int` int(11) NOT NULL DEFAULT '0',

`d_timestamp` timestamp NULL DEFAULT NULL,

`d_datetime` datetime DEFAULT NULL

) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8;

ALTER TABLE `datetime_test`

MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;

插入100万条测试数据:<?php  header( 'Content-Type: text/html; charset=UTF-8' );

set_time_limit(300); //最大执行时间这里设置300秒

//连接数据库

$pdo = new PDO("mysql:host=localhost;dbname=test","root","123");

for ($i = 1; $i <= 1000000; $i++) {

$d_int=$i;

$pdo->exec("insert into datetime_test(d_int,d_timestamp,d_datetime)

values($d_int,FROM_UNIXTIME($d_int),FROM_UNIXTIME($d_int))");

}

取中间的20万条做查询测试:SELECT FROM_UNIXTIME(400000), FROM_UNIXTIME(600000)

1970-01-05 23:06:40, 1970-01-08 06:40:00

第一种情况,MyISAM引擎, d_int/d_timestamp/d_datetime这三个字段都没有索引

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE d_int >400000 AND d_int<600000

查询花费 0.0780 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE d_int>UNIX_TIMESTAMP('1970-01-05 23:06:40') AND d_int

查询花费 0.0780 秒

效率不错。

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE d_timestamp>'1970-01-05 23:06:40' AND d_timestamp

查询花费 0.4368 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE UNIX_TIMESTAMP(d_timestamp)>400000 AND UNIX_TIMESTAMP(d_timestamp)<600000

查询花费 0.0780 秒

对于timestamp类型,使用UNIX_TIMESTAMP内置函数查询效率很高,几乎和int相当;直接和日期比较效率低。

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE d_datetime>'1970-01-05 23:06:40' AND d_datetime

查询花费 0.1370 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE UNIX_TIMESTAMP(d_datetime)>400000 AND UNIX_TIMESTAMP(d_datetime)<600000

查询花费 0.7498 秒

对于datetime类型,使用UNIX_TIMESTAMP内置函数查询效率很低,不建议;直接和日期比较,效率还行。

第二种情况,MyISAM引擎, d_int/d_timestamp/d_datetime这三个字段都有索引

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE d_int >400000 AND d_int<600000

查询花费 0.3900 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE d_int>UNIX_TIMESTAMP('1970-01-05 23:06:40') AND d_int

查询花费 0.3824 秒

对于int类型,有索引的效率反而低了,飘易的猜测是由于设计的表结构问题,多了索引,反倒多了一个索引查找。

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE d_timestamp>'1970-01-05 23:06:40' AND d_timestamp

查询花费 0.5696 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE UNIX_TIMESTAMP(d_timestamp)>400000 AND UNIX_TIMESTAMP(d_timestamp)<600000

查询花费 0.0780 秒

对于timestamp类型,有没有索引貌似区别不大。

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE d_datetime>'1970-01-05 23:06:40' AND d_datetime

查询花费 0.4508 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test` WHERE UNIX_TIMESTAMP(d_datetime)>400000 AND UNIX_TIMESTAMP(d_datetime)<600000

查询花费 0.7614 秒

对于datetime类型,有索引反而效率低了。

第三种情况,InnoDB引擎, d_int/d_timestamp/d_datetime这三个字段都没有索引

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE d_int >400000 AND d_int<600000

查询花费 0.3198 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE d_int>UNIX_TIMESTAMP('1970-01-05 23:06:40') AND d_int

查询花费 0.3092 秒

InnoDB引擎的查询效率明细比MyISAM引擎的低,低3倍+。

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE d_timestamp>'1970-01-05 23:06:40' AND d_timestamp

查询花费 0.7092 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE UNIX_TIMESTAMP(d_timestamp)>400000 AND UNIX_TIMESTAMP(d_timestamp)<600000

查询花费 0.3160 秒

对于timestamp类型,使用UNIX_TIMESTAMP内置函数查询效率同样高出直接和日期比较。

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE d_datetime>'1970-01-05 23:06:40' AND d_datetime

查询花费 0.3834 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE UNIX_TIMESTAMP(d_datetime)>400000 AND UNIX_TIMESTAMP(d_datetime)<600000

查询花费 0.9794 秒

对于datetime类型,直接和日期比较,效率高于UNIX_TIMESTAMP内置函数查询。

第四种情况,InnoDB引擎, d_int/d_timestamp/d_datetime这三个字段都有索引

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE d_int >400000 AND d_int<600000

查询花费 0.0522 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE d_int>UNIX_TIMESTAMP('1970-01-05 23:06:40') AND d_int

查询花费 0.0624 秒

InnoDB引擎有了索引之后,性能较MyISAM有大幅提高。

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE d_timestamp>'1970-01-05 23:06:40' AND d_timestamp

查询花费 0.1776 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE UNIX_TIMESTAMP(d_timestamp)>400000 AND UNIX_TIMESTAMP(d_timestamp)<600000

查询花费 0.2944 秒

对于timestamp类型,有了索引,反倒不建议使用MYSQL内置函数UNIX_TIMESTAMP查询了。

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE d_datetime>'1970-01-05 23:06:40' AND d_datetime

查询花费 0.0820 秒

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2` WHERE UNIX_TIMESTAMP(d_datetime)>400000 AND UNIX_TIMESTAMP(d_datetime)<600000

查询花费 0.9994 秒

对于datetime类型,同样有了索引,反倒不建议使用MYSQL内置函数UNIX_TIMESTAMP查询了。

【总结】:

对于MyISAM引擎,不建立索引的情况下(推荐),效率从高到低:int > UNIX_TIMESTAMP(timestamp) > datetime(直接和时间比较)>timestamp(直接和时间比较)>UNIX_TIMESTAMP(datetime) 。

对于MyISAM引擎,建立索引的情况下,效率从高到低: UNIX_TIMESTAMP(timestamp) > int > datetime(直接和时间比较)>timestamp(直接和时间比较)>UNIX_TIMESTAMP(datetime) 。

对于InnoDB引擎,没有索引的情况下(不建议),效率从高到低:int > UNIX_TIMESTAMP(timestamp) > datetime(直接和时间比较) > timestamp(直接和时间比较)> UNIX_TIMESTAMP(datetime)。

对于InnoDB引擎,建立索引的情况下,效率从高到低:int > datetime(直接和时间比较) > timestamp(直接和时间比较)> UNIX_TIMESTAMP(timestamp) > UNIX_TIMESTAMP(datetime)。

一句话,对于MyISAM引擎,采用 UNIX_TIMESTAMP(timestamp) 比较;对于InnoDB引擎,建立索引,采用 int 或 datetime直接时间比较。

MySQL时间字段效率_MYSQL数据库时间字段INT,TIMESTAMP,DATETIME性能效率比较相关推荐

  1. MYSQL数据库时间字段INT,TIMESTAMP,DATETIME性能效率比较

    from: http://www.piaoyi.org/database/MYSQL-INT-TIMESTAMP-DATETIME.html Author:飘易 Source:飘易 Categorie ...

  2. mysql 插入时间格式_MySQL数据库中有字段类型是日期、时间的插入语句的写法处理...

    MySQL数据库中,与时间有关的类型有 DATE,TIME,TIMESTAMP: 时间戳mysql> create table ts(f1 TIMESTAMP); Query OK, 0 row ...

  3. mysql添加时间默认值_mysql 创建时间字段添加默认值

    在创建时间字段的时候 例如:字段  create_time   默认值可以设置为CURRENT_TIMESTAMP插入数据时候会自动添加时间,默认值为当前时间 update_time  默认值可以设置 ...

  4. datetime mysql 查询_mysql数据库时间类型datetime、bigint、timestamp的查询效率比较

    数据库中可以用datetime.bigint.timestamp来表示时间,那么选择什么类型来存储时间比较合适呢? 前期数据准备 通过程序往数据库插入50w数据 数据表: CREATE TABLE ` ...

  5. 初识mysql数据字段属性_MySQL数据库~~~~初识、基础数据类型

    一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ...

  6. mysql字段约束_mysql数据库之表操作及字段约束条件

    一.存储引擎 二.表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id name age sex 1 li 12 male 2 liu ...

  7. mysql 数据表 时间自动_MySQL数据库时间设置自动添加时间和自动更新时间

    MySQL字段中设置时间字段自动添加创建时间和自动更新时间设置, 设置字段类型为:timestamp 默认值设置为current_timestamp(), 更新时间字段字段类型为:timestamp ...

  8. mysql text字段导出_Mysql数据库的各种命令:

    一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL. 首先打开DOS窗口,然后进入目录mysqlbin,再键入命令mysql -u root ...

  9. mysql怎么删除表中字段的数据库表_Mysql 数据库 表 字段的创建 修改 删除

    MYSQL基础上机练习题(一) 数据库.表.字段的创建.修改.删除 一.实验目的: 创建.修改.删除数据库 创建.修改.删除表 创建.修改.删除字段 二.内容: 创建一个用于企业管理的员工管理数据库, ...

最新文章

  1. mysql和redis统计网站活跃度,最代码网站用户私信列表采用mysql union查询优化为Redis查询的经验和相关代码片段分享...
  2. 自绘制View---------左右滑动刻度调频View
  3. Unity -----一些可能存在的错误
  4. [.NET源码] EF的增删改查
  5. laravel静态资源
  6. Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表
  7. leetcode - 221. 最大正方形
  8. 推荐几个阿里、腾讯、美团大佬的公众号
  9. cpu与简单模型机设计实验_180套经典夹具设计方案(附详解+模型),原来夹具设计这么简单!...
  10. 软件工程2 需求获取
  11. 关系抽取方法总结(基于规则-传统机器学习-深度学习)
  12. 联想电脑无法修复此计算机怎么办,联想一键还原不能用怎么办
  13. android桌面隐藏功能,如何开启 安卓10 隐藏的桌面模式并或者显示器拓展支持
  14. pytorch实战:采用Lenet运行iChallenge-PM数据集
  15. 微微一笑很倾城 从网红浅看CRM发展趋势
  16. 玩转WIN7的MKLINK
  17. 数据挖掘场景-发票虚开
  18. Unity3d开发MOBA游戏类《王者荣耀》记录(一)
  19. 地图坐标转换问题--百度地图定位偏
  20. 汽车电子学习【车载网络CAN/LIN】

热门文章

  1. 唐山劳动技师有计算机专业,唐山劳动技师等级技术学院
  2. 软件项目管理总结(1)软件项目管理概述
  3. 计算机二级java考试内容,2015年计算机二级java考试内容
  4. 以太坊:主对象 web3
  5. java 使用freemarker 导出word 和图片
  6. 仿淘宝右侧tab栏切换
  7. 计算机主机红灯不闪硬盘工作,电脑硬盘指示灯不亮怎么办?如何解决电脑硬盘灯不亮问题...
  8. as死机了怎么办_电脑老出现Dllc:windowssystem32asadhip.dll而且老死机怎么处理、高手求救...
  9. 逆向工程自学1(主流保护方式+破解交流网站+逆向工具)
  10. 2021年全球干细胞收入大约2832.7百万美元,预计2028年达到5673.4百万美元,2022至2028期间,年复合增长率CAGR为11.3%