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

from: http://www.piaoyi.org/database/MYSQL-INT-TIMESTAMP-DATETIME.html

Author:飘易 Source:飘易
Categories:数据库 PostTime:2016-10-28 13:12:22

正 文:

 

   在数据库设计的时候,我们经常会需要设计时间字段,在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<UNIX_TIMESTAMP('1970-01-08 06:40:00')
查询花费 0.0780 秒

效率不错。

 

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

 

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内置函数查询效率很低,不建议;直接和日期比较,效率还行。

 

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

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

 

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类型,有没有索引貌似区别不大。

 

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引擎, 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<UNIX_TIMESTAMP('1970-01-08 06:40:00')
查询花费 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<'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内置函数查询效率同样高出直接和日期比较。

 

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内置函数查询。

 

第四种情况,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<UNIX_TIMESTAMP('1970-01-08 06:40:00')
查询花费 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<'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查询了。

 

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 > 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直接时间比较。

 

作者:飘易
来源:飘易
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习《css世界》笔记之使用overflow做文字溢出点点点效果

效果图 HTML <p class"p1">qwertyuiopasdfghjklzxcvbnm</p><div class"d1"><p> 冯塘村过去经济较为落后。几年前&#xff0c;镇里以400多年的冯塘古村为基础&#xff0c;引来社会资金投资休闲农庄和共享民宿&#xff0c;把这里建…

Portal-Basic Java Web 应用开发框架:应用篇(十四) —— 异步 Action

Portal-Basic Java Web应用开发框架&#xff08;简称 Portal-Basic&#xff09;是一套功能完备的高性能Full-Stack Web应用开发框架&#xff0c;内置稳定高效的MVC基础架构和DAO框架&#xff08;已内置Hibernate、MyBatis和JDBC支持&#xff09;&#xff0c;集成 Action拦截、F…

类似No module named 'bs4'等错误的解决方法

from: https://www.cnblogs.com/xisheng/p/7856334.html 最近开始接触爬虫&#xff0c;写了如下源代码&#xff1a; from bs4 import BeautifulSoup import requests urlhttps://www.tripadvisor.cn/Attractions-g60763-Activities-New_York_City_New_York.html wb_datereque…

js中的Object.create(null) 和 {} 的区别

console.log(Object.create(null))console.log({})结果图 根据结果我们不难发现&#xff0c;两者最大区别在于Object.create(null)创建的对象没有继承Object 所有Object.create(null)创建的对象也没有Object提供的方法&#xff0c;是一个非常纯净的对象 ps: Object.create(obj…

java web 中的转发和重定向路径问题

为什么80%的码农都做不了架构师&#xff1f;>>> 假设应用程序的 contextPath 为 /ctx&#xff0c;在 http://localhost:8080/ctx/a/b 资源中&#xff0c;我们转发和重定向到 http://localhost:8080/ctx/x/y 资源&#xff0c;分别应该怎么写&#xff1f; 转发&…

断言assert使用方法

测试代码 console.log(开始)console.assert(true, true)console.assert(false,false)console.log(结束)结果 可以发现&#xff1a; assert方法中&#xff0c;第一个参数是判断条件&#xff0c;当为true时&#xff0c;不执行 。当为false时&#xff0c; 输出后面提示内容 且我们…

AngularJs学习笔记(四)

1、AngularJs中的Module可以包含哪些组件&#xff1f;&#xff08;1&#xff09;value&#xff1a;保存可以在不同的controller之间共享的对象、数据&#xff08;2&#xff09;constant&#xff1a;保存可以在不同的controller之间共享的常量&#xff08;3&#xff09;service&…

[你必须知道的异步编程]——异步编程模型(APM)

本专题概要&#xff1a;引言你知道APM吗&#xff1f;你想知道如何使用异步编程模型编写代码吗&#xff1f;使用委托也可以实现异步编程&#xff0c;你知道否&#xff1f;小结一、引言在前面的C#基础知识系列中介绍了从C#1.0——C#4.0中一些主要特性&#xff0c;然而.NET 4.5更新…

iOS 10 的一个重要更新-自定义的通知界面

续上篇&#xff0c;在简单闹钟的例子上&#xff0c;在通知界面上显示图片动画&#xff0c;并用通知关联的按钮更新通知界面。介绍 iOS 10 通知 API 的扩展&#xff1a;自定义通知显示界面。 新框架可以统一处理本地通知和远程推送&#xff0c;同时增加了一些新 API 来控制等待中…

[USACO 1.3.3]Calf Flac

o(︶︿︶)o 烦躁&#xff0c;看了半天没看懂这个O(n)的回文串算法是什么东西&#xff0c;直接套上模板就交了。然后AC了 题目&#xff1a; Description 据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去这些牛…

Class.forName()用法详解

Class.forName()用法详解 标签&#xff1a; classjvmjdbc数据库documentationjava2012-03-29 09:39 40414人阅读 评论(8) 收藏 举报分类&#xff1a;Java考古学&#xff08;74&#xff09; 主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要…

应对不良网络文化的技术之一——网络信息抽取技术

1 引言 2008年1月17日&#xff0c;中国互联网络信息中心(CNNIC)发布了《第21次中国互联网络发展状况统计报告》[1]&#xff0c;报告显示&#xff1a; (1) 截至2007年12月&#xff0c;网民数已增至2.1亿人。中国网民数增长迅速&#xff0c;比2007年6月增加4800万人&…

HBuilder完成webApp入门(2)

一、HBuilder的下载地址&#xff1a;http://www.dcloud.io/&#xff0c;点击那个“DownLoad”就可以 了 二、假设一切顺利&#xff0c;启动HBuilder后&#xff0c;大家会看到如下的界面 点击新建移动APP&#xff1a; 接下来就会弹出一个选择模板的对话框&#xff1a; 默认的模板…

高可用集群 heartbeatv1实例

——————— 高可用集群的简单配置 ————————地址规划 主节点&#xff1a;HA1 172.16.21.13 hostname node2.magedu.com备节点&#xff1a; HA2 172.16.21.14 hostname node1.magedu.comVIP 172.16.21.9前提工作1&#xff0c;配置主机名 hostname保证uname …

你知道“拉黑”、“关注”、“点赞”、“转发”、“分享到朋友圈”等英语咋说吗?

From: https://www.sohu.com/a/220161051_559507 “分享到朋友圈”等英语咋说吗&#xff1f; Mini apps 小程序 小程序”&#xff08;mini apps&#xff09;是一个不需要下载安装就可使用的应用&#xff08;apps that can be accessed without downloading&#xff09;&#x…

配套自测连载(三)

接上期(答案已给出)本期是专门针对《深入理解计算机网络》图书第4章而编写的10道计算机网络体系架构中的物理层技术自测题&#xff0c;可以检验你对本章的学习效果。把你的答案直接写在评论中即可&#xff0c;笔者将在每期发表10天后给出正确答案。本书是国内最通俗、最系统的计…

[json] JSON for Modern C++

有幸能接触到这个&#xff0c;这是我遇到的使用最方便的json了&#xff0c;效率没研究过&#xff01; 简单了使用了下&#xff0c;感觉非常好用&#xff0c;记录下&#xff1a; 要使用这个json&#xff0c;只需要使用json.hpp就行&#xff0c;放入自己的工程里&#xff0c;但…

libinject的编译

libinject是一个Android进程注入实例&#xff0c;其下载地址为&#xff1a;http://download.csdn.net/download/ljhzbljhzb/3680780 libinject的编译需要NDK开发环境&#xff0c;在NDK安装成功之后&#xff0c;可以先将其自带的实例中的HelloJni导入到eclipse中&#xff0c;编译…

Linux Supervisor 守护进程基本配置

supervisor:C/S架构的进程控制系统&#xff0c;可使用户在类UNIX系统中监控、管理进程。常用于管理与某个用户或项目相关的进程。 组成部分supervisord&#xff1a;服务守护进程supervisorctl&#xff1a;命令行客户端Web Server&#xff1a;提供与supervisorctl功能相当的WEB操…

三阶魔方还原公式

From: https://www.cnblogs.com/zqifa/p/mofang-1.html 1. 第二层棱块归位&#xff1a; 2. 顶层十字 3. 顶层棱中间块归位 这一步的目的是使顶层的4个棱中间块全部归位。 转动顶层(U)&#xff0c;若可以使一个棱中间块归位(如下图左&#xff0c;这里以[红-黄]块为例)&#x…