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(非定长、int时间)




CREATE TABLE `test`.`date_test` (
`id` INT NOT NULL AUTO_INCREMENT ,
`start_time` INT NOT NULL ,
`some_content` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

第二步、创建第二个表date_test2(定长、int时间)




CREATE TABLE `test`.`date_test2` (
`id` INT NOT NULL AUTO_INCREMENT ,
`start_time` INT NOT NULL ,
`some_content` CHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

第三步、创建第三个表date_test3(varchar、datetime时间)




CREATE TABLE `test`.`date_test3` (
`id` INT NOT NULL AUTO_INCREMENT ,
`start_time` DATETIME NOT NULL ,
`some_content` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

第四步、创建第四个表date_test3(char、datetime时间)




CREATE TABLE `test`.`date_test4` (
`id` INT NOT NULL AUTO_INCREMENT ,
`start_time` DATETIME NOT NULL ,
`some_content` CHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = InnoDB;

ok,现在我们开始做测试,环境是php,先向各个表插入一百万条数据。插入的时候分200次,每次进库5000条。

表一执行记录:页面运行时间: 26.5997889042 秒,插入的时候发现一个有趣的现象:SELECT count( id ) FROM `date_test` WHERE 1 的结果是100w,而直接select * from `date_test`却是1,000,374条结果。(后来看到这是一个可能接近的值,请参看MySQL FAQ 3.11)。

表二执行记录:页面运行时间: 62.3908278942 秒,这次记录是1,000,066条。

表三执行记录:页面运行时间: 30.2576560974 秒,这次的是1,000,224条。

表四执行记录:页面运行时间: 67.5393900871 秒,这次的是:1,000,073条。

现在把四个表的start_time字段一一加上索引。

测试四个表的更新,分别update 100条记录,并记录时间:

表一:页面运行时间: 2.62180089951 秒(非定长,int时间)

表二:页面运行时间: 2.5475358963 秒(定长,int时间)

表三:页面运行时间: 2.45077300072 秒(varchar,datetime时间)

表四:页面运行时间: 2.82798409462 秒(char,datetime时间)

测试四个表的读取,分别select 100条随机记录,以主键id为条件查询,并记录时间:

表一:页面运行时间: 0.382651090622 秒(非定长,int时间)

表二:页面运行时间: 0.542181015015 秒(定长,int时间)

表三:页面运行时间: 0.334048032761 秒(varchar,datetime时间)

表四:页面运行时间: 0.506206989288 秒(char,datetime时间)

测试四个表的读取,分别select 10条随机记录,以star_time为条件查询,并记录时间:

表一:页面运行时间: 30.1972880363 秒(非定长,int时间)

表二:页面运行时间: 65.1926910877 秒(定长,int时间)

表三:页面运行时间: 39.7210869789 秒(varchar,datetime时间)

表四:页面运行时间: 70.4632740021 秒(char,datetime时间)

因为量比较小,所以我们默认即使是微小的变化,也是有意义的。

结论:

大数据量下,如果存在大量的select * from table where 时间>XX这样的查询,在MySQL5.1时使用int换datetime是有意义的。

(0)

相关推荐

  • 简单谈谈MySQL中的int(m)

    我们在设计表的时候,如果碰到需要设置int(整型)的时候,通常会按照惯例(大家都这样写)设置成int(11).那么这里为什么是11呢?代表的又是什么呢? 以前我一直以为这里是在限制int显示的宽度,后来仔细研究和通过上网查询发现,事实并不是那样的. 确切的来说,这里的"宽度"只是一个"预期值",它所代表的仅仅是你在设计数据表结构时,想让该列日后显示的值宽度为多少,但是具体存入值的宽度多少不会受任何影响. 当然,它的作用不仅如此,在存入数据的时候,还是有一定区别的,这

  • 详解MySQL数据类型int(M)中M的含义

    介绍 MySQL 数据类型中的 integer types 有点奇怪.你可能会见到诸如:int(3).int(4).int(8) 之类的 int 数据类型.刚接触 MySQL 的时候,我还以为 int(3) 占用的存储空间比 int(4) 要小, int(4) 占用的存储空间比 int(8) 小. 后来,参看 MySQL 手册,发现自己理解错了. int(M): M indicates the maximum display width for integer types. 在 integer

  • 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)

  • php数据入库前清理 注意php intval与mysql的int取值范围不同

    php保存数据到mysql 打算在dao层进行数据入库前的清理,比如varchar进行trim,int进行intval. 有一天突然想起,php intval的取值范围与mysql的int类型一样吗? 查了一下,不一样-- http://php.net/manual/en/function.intval.phphttp://dev.mysql.com/doc/refman/5.1/zh/column-types.html#numeric-typesphp intval的取值范围:与操作系统相关,

  • mysql int(3)与int(11)的区别详解

    mysql int(3)与int(11)的区别 总结,int(M) zerofill,加上zerofill后M才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)和int(10)不加zerofill,则它们没有什么区别.M不是用来限制int个数的.int(M)的最大值和最小值与undesigned有关,最下面那副图有说明. mysql> create table t (t int(3) zerofil

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

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

  • mysql修改自增长主键int类型为char类型示例

    原来有一个表中的主键是int自增长类型, 因为业务变化需要把int改成char类型的主键.同时因为原来的表中已经存在了数据,不能删除表重建,只能修改表结构. 首先去掉自增长属性: alter table table_name  change indexid indexid int; 然后去掉主键: ALTER TABLE table_name   DROP   primary key; 修改表结构为char类型: alter table table_name change indexid ind

  • mysql日期date型和int型互换的方法

    一.date型转换成int型 UNIX_TIMESTAMP('1997-10-04 22:23:00')  =====> 875996580 二.int型转换成date型 FROM_UNIXTIME(875996580) =====> '1997-10-04 22:23:00' PHP里面将int型数据转换成日期输出 echo date('Y-m-d',$date); PHP里面将date型数据输出: echo $date; PHP里面将date型数据转换成int型: strtotime($d

  • mysql中int、bigint、smallint 和 tinyint的区别详细介绍

    最近使用mysql数据库的时候遇到了多种数字的类型,主要有int,bigint,smallint和tinyint.其中比较迷惑的是int和smallint的差别.今天就在网上仔细找了找,找到如下内容,留档做个总结: 使用整数数据的精确数字数据类型. bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. P.S. bigint已经有长度了,在mysql建表中的len

  • 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时间字段默认设置为当前时间实例代码

    目录 mysql时间字段默认为当前时间 附:mysql 字段 default 默认赋值 当前系统时间 总结 mysql时间字段默认为当前时间 1.直接在创建表时添加该列并声明默认值,如下: CREATE TABLE `table1` ( `id` int(11) NOT NULL, `createtime` timestamp NULL default CURRENT_TIMESTAMP, `updatetime` timestamp NULL default CURRENT_TIMESTAMP

  • 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中datetime时间字段的四舍五入操作

    目录 前言 1.背景 2.模拟测试 3.结论 总结 前言 如果不是踩到坑,我估计到现在还不知道时间字段会四舍五入. 1.背景 通过 Java 代码获取当日最大时间,然后存入数据库,数据库表字段格式 datetime 保留 0 位. now.with(LocalTime.MAX) 小小的一行代码,获取今天的最大日期. 到数据库一看,好家伙,竟然存了第二天的时间. 看着样子是四舍五入了! 2.模拟测试 执行之后,看一下日志: 使用的是 2021-09-28T23:59:59.999999999,但是

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

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

  • 浅谈Mysql时间的存储 datetime还是时间戳timestamp

    目录 简单对比 占用空间 优缺对比 如何存储毫秒或者更高级别的小数? 时间戳详解 一个方便的用法 显示格式(非存储格式) java可能遇到的坑 简单对比 占用空间 MySQL 常用的日期时间类型常用的是datetime.timestamp.除此之外 还有用的不多的YEAR DATE TIME注意5.6.4的版本 从上表可以看到,DATETIME默认占用5个字节,而TIMESTAMP默认占用4个字节,如果需要更高精度的存储(秒后的小数点个数,比如毫秒)那么需要额外的存储空间. 优缺对比 DATET

  • MySQL 时间类型用 datetime, timestamp 还是 integer 更好

    目录 问题 MySQL 支持的数据类型 Integer Datetime TIMESTAMP DATETIME Integer BETWEEN 查询 性能差异 问题 今天我们来探讨一个有意思的问题,先说场景: 这是一个做在线文档产品的业务,需要给用户展示文档的编辑记录,现在我们叫它[智能文档]. 智能文档会不定期给文档数据打一个快照,保存起来.用户可以在历史记录中查阅快照. 快照之间会展示具体的变更记录,比如“用户A 复制了一段文字”,“用户B删除了一个图片”. 快照本身是动态生成和回收的,即距

  • 使用MYSQL TIMESTAMP字段进行时间加减运算问题

    目录 MYSQL TIMESTAMP字段进行时间加减运算 计算公式如下 DATETIME 与 TIMESTAMP的区别 结论 参考文档 MYSQL TIMESTAMP字段进行时间加减运算 在数据分析过程中,想当然地对TIMESTAMP字段进行运算,导致结果谬之千里 计算公式如下 -- create_time与week_time的声明都是TIMESTAMP(), 要求精确到分钟 -- SELECT (sa.create_time - sa.week_time)/(1000 * 60) from a

  • MySQL 时间类型的选择

    MySQL 提供了 DATETIME 和 TIMESTAMP 两种非常相似的类型处理日期和时间,大部分情况下两种都是 OK 的,但是有些情况二者会互有优劣. DATETIME DATETIME 的时间跨度更大,可以从1001年到9999年,精度是秒.并且存储的格式是将日期和时间打包使用 YYYYMMDDhhmmss格式的整数存储,这个时间与时区无关,需要占用8个字节的存储空间.默认,MySQL 显示 的DATETIME是有序的,明确的格式,例如2021-06-02 18:35:23.这是 ANS

  • mysql timestamp字段规范使用详情

    目录 1. 前言 2. mysql中的时间字段 2.1. 数据的存储方式 2.2. DATETIME和TIMESTMAP的区别 3. timestamp字段处理默认值和null值时的行为 3.1. 参数禁用 3.2. 参数启用 4. 总结 1. 前言 这个世界离不开时间,同样,数据库中也是如此,表中的每条记录除了数据模型的时间字段(如生日,生产日期,出发日期等),一般至少还有两个固定的时间字段:记录插入时间,记录更新时间. 然而,看似很简单时间字段,谁能想到会导致应用报错,引发血案: 个中缘由,

随机推荐