MYSQL 数据库时间字段 INT,TIMESTAMP,DATETIME 性能效率的比较介绍

目录
  • 一、准备工作
    • 1.1 建表
    • 1.2 插入100万条测试数据
  • 二、MyISAM引擎
    • 2.1 MyISAM 引擎无索引下的 dint/dtimestamp/d_datetime
      • 2.1.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比
      • 2.1.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比
      • 2.1.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比
    • 2.2 MyISAM 引擎有索引下的 dint/dtimestamp/d_datetime
      • 2.2.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比
      • 2.2.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比
      • 2.2.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比
  • 三、InnoDB引擎
    • 3.1 InnoDB 引擎无索引下的 dint/dtimestamp/d_datetime
      • 3.1.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比
      • 3.1.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比
      • 3.1.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比
    • 3.2 InnoDB 引擎无索引下的 dint/dtimestamp/d_datetime
      • 3.2.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比
      • 3.2.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比
      • 3.2.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比
  • 四、总结

前言:

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

就这个问题,来一个实践出真知吧。

一、准备工作

1.1 建表

CREATE TABLE IF NOT EXISTS `datetime_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1,
  `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;

1.2 插入100万条测试数据

//插入d_intvalue=1到100万之间的数据
insert into datetime_test(d_int,d_timestamp,d_datetime)
values(d_intvalue,FROM_UNIXTIME(d_intvalue),FROM_UNIXTIME(d_intvalue));

取中间的 20 万条做查询测试:

SELECT FROM_UNIXTIME(400000), FROM_UNIXTIME(600000)
1970-01-05 23:06:40, 1970-01-08 06:40:00

二、MyISAM引擎

2.1 MyISAM 引擎无索引下的 dint/dtimestamp/d_datetime

2.1.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比

//SQL_NO_CACHE意思是说查询时不适用缓存
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<UNIX_TIMESTAMP('1970-01-08 06:40:00')

查询花费 0.0780 秒

效率不错

2.1.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比

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

查询花费 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相当;直接和日期比较效率低。

2.1.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比

SELECT SQL_NO_CACHE count(id) FROM `datetime_test`
WHERE d_datetime>'1970-01-05 23:06:40'
AND d_datetime<'1970-01-08 06:40:00'
查询花费 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 内置函数查询效率很低,不建议;直接和日期比较,效率还行。

2.2 MyISAM 引擎有索引下的 dint/dtimestamp/d_datetime

2.2.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比

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<UNIX_TIMESTAMP('1970-01-08 06:40:00')
查询花费 0.3824 秒

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

2.2.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比

SELECT SQL_NO_CACHE count(id) FROM `datetime_test`
WHERE d_timestamp>'1970-01-05 23:06:40'
AND d_timestamp<'1970-01-08 06:40:00'
查询花费 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 类型,有没有索引貌似区别不大。

2.2.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比

SELECT SQL_NO_CACHE count(id) FROM `datetime_test`
WHERE d_datetime>'1970-01-05 23:06:40'
AND d_datetime<'1970-01-08 06:40:00'
查询花费 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引擎

3.1 InnoDB 引擎无索引下的 dint/dtimestamp/d_datetime

3.1.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比

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<UNIX_TIMESTAMP('1970-01-08 06:40:00')
查询花费 0.3092 秒

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

3.1.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2`
WHERE d_timestamp>'1970-01-05 23:06:40'
AND d_timestamp<'1970-01-08 06:40:00'
查询花费 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 内置函数查询效率同样高出直接和日期比较。

3.1.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2`
WHERE d_datetime>'1970-01-05 23:06:40'
AND d_datetime<'1970-01-08 06:40:00'
查询花费 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 内置函数查询。

3.2 InnoDB 引擎无索引下的 dint/dtimestamp/d_datetime

3.2.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比

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<UNIX_TIMESTAMP('1970-01-08 06:40:00')
查询花费 0.0624 秒

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

3.2.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2`
WHERE d_timestamp>'1970-01-05 23:06:40'
AND d_timestamp<'1970-01-08 06:40:00'
查询花费 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 查询了。

3.2.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比

SELECT SQL_NO_CACHE count(id) FROM `datetime_test2`
WHERE d_datetime>'1970-01-05 23:06:40'
AND d_datetime<'1970-01-08 06:40:00'
查询花费 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 > UNIXTIMESTAMP(timestamp) > datetime(直接和时间比较)> timestamp(直接和时间比较)> UNIXTIMESTAMP(datetime) 。
  • 对于 MyISAM 引擎,建立索引的情况下,效率从高到低:UNIXTIMESTAMP(timestamp) > int > datetime(直接和时间比较)>timestamp(直接和时间比较)>UNIXTIMESTAMP(datetime) 。
  • 对于 InnoDB 引擎,没有索引的情况下(不建议),效率从高到低:int > UNIXTIMESTAMP(timestamp) > datetime(直接和时间比较) > timestamp(直接和时间比较)> UNIXTIMESTAMP(datetime)。
  • 对于 InnoDB 引擎,建立索引的情况下,效率从高到低:int > datetime(直接和时间比较) > timestamp(直接和时间比较)> UNIXTIMESTAMP(timestamp) > UNIXTIMESTAMP(datetime)。
  • 一句话,对于 MyISAM 引擎,采用 UNIX_TIMESTAMP(timestamp) 比较;对于InnoDB 引擎,建立索引,采用 int 或 datetime直接时间比较。

到此这篇关于MYSQL 数据库时间字段 INT,TIMESTAMP,DATETIME 性能效率的比较介绍的文章就介绍到这了,更多相关MYSQL 时间字段 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何创建一个创建MySQL数据库中的datetime类型

    目录 一.domain用法及示例 二.创建MySQL中datetime类型 三.create type用法及示例 环境系统平台:Microsoft Windows (64-bit) 10版本:4.5 瀚高数据库中支持使用以下语句创建用户定义的数据类型: ​CREATE DOMAIN​:它创建了一个用户定义的数据类型,可以有可选的约束,基于其他基本类型,实质是定义一个域. ​CREATE TYPE​:它通常用于使用存储过程创建复合类型(两种或多种数据类型混合的数据类型). 一.domain用法及示

  • python3实现往mysql中插入datetime类型的数据

    昨天在这个上面找了好久的错,嘤嘤嘤~ 很多时候我们在爬取数据存储的时候都需要将当前时间作为一个依据,在python里面没有时间类型可以直接拿来就用的.我们只需要在存储之前将时间类型稍作修饰就行. datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 如: #插入产品信息 insert_good_sql = """ INSERT INTO T_GOOD(good_name, good_type, img_

  • MySQL表字段时间设置默认值

    应用场景 在数据表中,要记录的每条数据是什么时候创建的,不需要应用程序去特意记录,而是由数据库获取当前时间自动记录创建时间. 在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意记录,而由数据库获取当前时间自动记录修改时间. 在数据库中获取当前时间 oracle:select sysdate from dual; sqlserver:select getdate(); mysql:select sysdate();  select now(); MySQL中时间函数NOW()和SYS

  • php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)

    php.mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳) //其中 video 是表名: //createtime 是字段: // //数据库time字段为时间戳 // //查询当天: $start = date('Y-m-d 00:00:00'); $end = date('Y-m-d H:i:s'); SELECT * FROM `table_name` WHERE `time` >= unix_timestamp( '$start' ) AND `time` <= uni

  • mysql中datetime类型设置默认值方法

    通过navicat客户端修改datetime默认值时,遇到了问题. 数据库表字段类型datetime,原来默认为NULL,当通过界面将默认值设置为当前时间时,提示"1067-Invalid default value for 'CREATE_TM'",而建表的时候,则不会出现这个问题,比如建表语句: CREATE TABLE `app_info1` ( `id` bigint(21) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `a

  • Mysql中tinyint(1)和tinyint(4)的区别详析

    目录 1.varchar(M)和数值类型tinyint(M) 的区别 2测试 总结 1. varchar(M)和数值类型tinyint(M) 的区别 字符串类型:varchar(M)而言,M是字段中可以存储的最大字符串,也就是说字段长度.根据设置,当你插入的数值超过字段设置的长度时,很有可能会收到错误提示,如果没有收到提示,插入的数据也有可能被自动的截断以适应该字段的预定义长度.所有像varchar(5)表示其存储的字符串长度不能超过5. 数值列类型:其长度修饰符表示最大宽度,与该字段物理存储没

  • MySQL日期及时间字段的查询

    目录 1.日期和时间类型概览 2.日期和时间相关函数 3.日期和时间字段的规范查询 前言: 在项目开发中,一些业务表字段经常使用日期和时间类型,而且后续还会牵涉到这类字段的查询.关于日期及时间的查询等各类需求也很多,本篇文章简单讲讲日期及时间字段的规范化查询方法. 1.日期和时间类型概览 MySQL支持的日期和时间类型有 DATETIME.TIMESTAMP.DATE.TIME.YEAR , 几种类型比较如下: 涉及到日期和时间字段类型选择时,根据存储需求选择合适的类型即可. 2.日期和时间相关

  • MySQL中int (10) 和 int (11) 的区别

    mysql 中整数数据类型: 不同类型的取值范围: 不同数据类型的默认v显示宽度: 显示的宽度跟负号没有关系,它只在人工设置了 ZEROFILL 属性有效.一旦人工设置了 ZEROFILL 属性,MySQL 会自动设置 UNSIGNED 属性(即 ZEROFILL 不能存储负数). 那取值范围和显示宽度到底有什么关系呢?利用 tinyint 做了个实验, 首先创建一张表如下: mysql> desc test_integer; +-----------+------------+------+-

  • MySQL时间字段究竟使用INT还是DateTime的说明

    今天解析DEDECMS时发现deder的MYSQL时间字段,都是用 `senddata` int(10) unsigned NOT NULL DEFAULT '0'; 随后又在网上找到这篇文章,看来如果时间字段有参与运算,用int更好,一来检索时不用在字段上转换运算,直接用于时间比较!二来如下所述效率也更高. 归根结底:用int来代替data类型,更高效. 环境: Windows XP PHP Version 5.2.9 MySQL Server 5.1 第一步.创建一个表date_test(非

  • MYSQL 数据库时间字段 INT,TIMESTAMP,DATETIME 性能效率的比较介绍

    目录 一.准备工作 1.1 建表 1.2 插入100万条测试数据 二.MyISAM引擎 2.1 MyISAM 引擎无索引下的 dint/dtimestamp/d_datetime 2.1.1 int 类型是否调用 UNIX_TIMESTAMP 优化对比 2.1.2 timestamp 类型是否调用 UNIX_TIMESTAMP 优化对比 2.1.3 datetime 类型是否调用 UNIX_TIMESTAMP 优化对比 2.2 MyISAM 引擎有索引下的 dint/dtimestamp/d_d

  • MySQL数据库中把int转化varchar引发的慢查询

    最近一周接连处理了2个由于int向varchar转换无法使用索引,从而引发的慢查询. CREATE TABLE `appstat_day_prototype_201305` ( `day_key` date NOT NULL DEFAULT '1900-01-01', `appkey` varchar(20) NOT NULL DEFAULT '', `user_total` bigint(20) NOT NULL DEFAULT '0', `user_activity` bigint(20)

  • JDBC对MySQL数据库布尔字段的操作方法

    本文实例讲述了JDBC对MySQL数据库布尔字段的操作方法.分享给大家供大家参考.具体分析如下: 在Mysql数据库如果要使用布尔字段,而应该设置为BIT(1)类型 此类型在Mysql中不能通过MySQLQueryBrowser下方的Edit与Apply Changed去编辑 只能通过语句修改,比如update A set enabled=true where id=1 把A表的id为1的这一行为BIT(1)类型的enabled字段设置为真 在JAVA中,使用JDBC操作这个字段的代码如下: c

  • Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: 通过使用addBatch()和executeBatch()这一对方法可以实现批量处理数据. 不过值得注意的是,首先需要在数据库链接中设置手动提交,connection.setAutoCommit(false),然后在执行Statement之后执行connection.commit(). import java.io.Bu

  • 在mysql数据库原有字段后增加新内容

    复制代码 代码如下: update table set user=concat(user,$user) where xx=xxx;

  • Mysql数据库中把varchar类型转化为int类型的方法

    在上篇文章给大家讲了MySQL数据库中把int转化varchar引发的慢查询,本文给大家介绍Mysql数据库中把varchar类型转化为int类型的方法,一起看看吧! mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过? CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另一个类型的值. 这个类型 可以是以下值其中的 一个: BINARY[(N)] CHAR[(N)] DATE DATETIME DECIMAL SIGNED [INTEG

  • mysql数据库入门第一步之创建表

    创建数据库 右键-新建数据库 输入库名.选择字符集和排序规则,点确定 创建数据库成功 新建表 my-表-右键-新建表 如上图所示,在第一个标签页"栏位"中 名:字段的名字 类型:字段的类型,有几十种,常用的有以下几种 char,可以存定长的字符串 varchar,可以存变长的字符串(定长和变长的区别在长度中介绍) int,可以存-2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 之间的数字 datetime,可以存日期类型的数据 长度:数

  • 关于SpringBoot mysql数据库时区问题

    寻找原因 后端开发中常见的几个时区设置 第一个设置点配置文件   spring.jackson.time-zone 第二个设置点 高版本SpringBoot版本 mysql-connector-java 用的是8.X,mysql8.X的jdbc升级了,增加了时区(serverTimezone)属性,并且不允许为空. 第三个设置点 mysql  time_zone变量 词义 serverTimezone临时指定mysql服务器的时区 spring.jackson.time-zone  设置spri

  • 一文带你玩转MySQL获取时间和格式转换各类操作方法详解

    目录 前言 一.SQL时间存储类型 1.date 2.datetime 3.time 4.timestamp 5.varchar/bigint 二.获取时间 1.now() 2.localtime() 3.current_timestamp() 4.localtimestamp() 5.sysdate() 6.curdate() 7.current_time() 8. curtime() 9.current_time() 10. utc_date() 11.utc_time 12.utc_tim

  • MYSQL数据库Innodb 引擎mvcc锁实现原理

    目录 1 数据库设置隔离级别 2 数据库表以及案例操作 3 mvcc 实现原理 4 ACID 的实现 前言: 大家都知道在java 开发过程中,会经常用到锁,在java 代码中,我们都知道锁是加在对象头上的,在java对象布局中有锁的标志位.程序通过判断锁的标志位来获取加锁的情况.但是在mysql 中,锁的实现原理是什么呢.可能大家都听过 mvcc,但是mvcc 的实现原理是什么呢,可能就说不太清楚了,本文就以实例说明来mvcc 的实现原理. 1 数据库设置隔离级别 我们都知道数据库的隔离级别可

随机推荐