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;把这里建…

关于 部署方面研究 Visual Studio 2013

InstallShield2013LimitedEdition 下载地址 http://download.csdn.net/download/yuanyuan_186/7681385 转载于:https://www.cnblogs.com/tianheBologs/p/5996361.html

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…

C. Vanya and Scales

C. Vanya and Scalestime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputVanya has a scales for weighing loads and weights of masses w0, w1, w2, ..., w100 grams where w is some integer not less than 2(exac…

js_组合继承(最常用的继承方式)

<script type"text/javascript">//组合继承: 将原型链和借用构造函数的技术组合在一起//使用原型链实现对原型方法的继承//使用构造函数实现对实例属性的继承//js中最常用的继承方式//super:超类function SuperType(name) {//超类属性//使用构造函数实现对实例…

Hello World(本博客启程篇)

Hello World 作为本博客第一篇日志&#xff0c;作为程序员&#xff0c;无论走到哪里&#xff0c;做什么事&#xff0c;必须先输出这句话。 一个想法  从今天3月份到现在一直在学技术&#xff0c;过程中坑的解决、知识的总结以及想法等都写到了“有道云笔记”。 写有道云笔记的…

php7.2 event扩展php_sockets_le_socket错误解决

环境: [rootlocalhost php.d]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [rootlocalhost php.d]# php -v PHP 7.2.10 (cli) (built: Sep 15 2018 07:10:58) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-201…

NYOJ_37_回文字符串

首先&#xff0c;我们把字符串反转&#xff0c;然后用反串和原串求最大公共子序列&#xff0c;再用字符串长度减去最大公共子序列的长度就是答案&#xff0c;我们还可以用滚动数组优化内存 状态转移方程&#xff1a; (i长度的a串和j长度的b串的最长公共子序列长度&#xff09; …

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…

matplotlib —— 添加文本信息(text)

matplotlib.pyplot.text(x, y, s, fontdictNone, withdashFalse, **kwargs) x, y&#xff1a;表示坐标&#xff1b;s&#xff1a;字符串文本&#xff1b;fontdict&#xff1a;字典&#xff0c;可选&#xff1b;kw&#xff1a; fontsize12,horizontalalignment‘center’、ha’c…

值得推荐的C/C++框架和库 (真的很强大)

From: https://blog.csdn.net/u011628751/article/details/69258637/ 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在Linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL&#xff0c;测试网站在压力下工作的性能&#xff0c;…

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更新…

[libuv] libuv安装

环境: centos7.2, gcc,g version: 4.8.5 yum install -y libuv libuv-devel

pc浏览器内核详解

浏览器最重要的部分是浏览器的内核。浏览器内核是浏览器的核心&#xff0c;也称“渲染引擎”&#xff0c;用来解释网页语法并渲染到网页上。浏览器内核决定了浏览器该如何显示网页内容以及页面的格式信息。不同的浏览器内核对网页的语法解释也不同&#xff0c;因此网页开发者需…

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 据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去这些牛…