Mysql FROM_UNIXTIME效率 VS PHP date()效率 数据说话!
这几天在做数据统计,有几个统计图的需求是这样的: 按照年、月、日统计订单数量, 比方一年12个月,统计出1月多少订单,二月多少订单,按照这种模式统计。
但是数据库里存放的是 timestamp 的 current_timestamp 默认值——"2016-12-16 12:30:00"。(这里许多公司会使用时间戳,其实都差不多)
当时脑子里想到的第一种做法是,讲所有数据一次性取出来,然后foreach 一个个date()后,得到日期后再一个个去分组。
后来考虑到如果数据量大了,性能上会不会出问题。就想到了mysql 内置的FROM_UNIXTIME() 函数 然后用一个group by 分组解决。
date("Y-m-d", 1481862600) = 2016-12-16 12:30:00
FROM_UNIXTIME(add_time, '%Y-%m-%d')
为了比较两个函数之间的效率,我做了一个实验,
1、创建一张表 只有三个字段
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`remark` char(10) DEFAULT NULL,
`add_time` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=458731 DEFAULT CHARSET=latin1;
2、再用自我复制语句,迅速将表数据复制到了20多万条数据
INSERT INTO t1(remark,add_time) SELECT remark,add_time FROM t1
3、接下来是PHP的执行代码
第一种,使用PHP的date函数循环赋值:
// 获取开始时间的微妙
$startTime = microtime(true);
$pdo = new PDO("mysql:host=localhost;dbname=test","root","");
$rs = $pdo -> query("select id,add_time,remark from t1 limit 262144");
$data = $rs->fetchAll(); $php_number_count = 0;
foreach ($data as $item){
$php_number_count +=1;
$tmp[] = date("Y-m-d", $item['add_time']);
} echo $php_number_count."<br>";
echo "开始时间:".$startTime."<br>";
echo "结束时间:".$endTime = microtime(true). "<br>";
$resTime = $endTime - $startTime;
echo "用时:".$resTime;exit;
输出结果
开始时间:1481871208.7704
结束时间:1481871210.1535
用时:1.3830921649933 秒
第二种使用mysql的FROM_UNIXTIME()函数
// 获取开始时间的微妙
$startTime = microtime(true);
$pdo = new PDO("mysql:host=localhost;dbname=test","root","");
$rs = $pdo -> query("select id,remark,add_time,FROM_UNIXTIME(add_time, '%Y-%m-%d') as datetime from t1 limit 262144");
$data = $rs->fetchAll(); echo "开始时间:".$startTime."<br>";
echo "结束时间:".$endTime = microtime(true). "<br>";
$resTime = $endTime - $startTime;
echo "用时:".$resTime;exit;
输出结果:
开始时间:1481871495.7308
结束时间:1481871496.7279
用时:0.99707913398743
从上面的结果显示明显是 使用 mysql的 FROM_UNIXTIME()函数要快一些
但是发现在使用PHP的date()函数里 多个一个对结果集的foreach 循环,为了保证数据的严谨性,我又再 使用 mysql的 FROM_UNIXTIME() 的后面加了一个结果集的foreach循环来尽量保证结果的准确性 如下
// ..........
$data = $rs->fetchAll();
foreach ($data as $row){
$tmp[] = $row['add_time'];
};
// .........
结果:
开始时间:1481871764.8102
结束时间:1481871766.0483
用时:1.2380890846252
为了尽量避免数据的偏差性、不稳定性,每份代码我分别执行了10次,并记录下结果
最后得出的结果是, 使用FROM_UNIXTIME()函数 是速度是最快的,如果group by 后能直接得到想要的结果集,那自然是最好的。
不过我们不能忽略mysql数据库执行的开销。毕竟执行中一定程度上会加大数据库的压力。
最后这个世界是没有最好的办法,只有最适合的办法。 如果哪位大侠有哪种更好的办法,欢迎分享。
Mysql FROM_UNIXTIME效率 VS PHP date()效率 数据说话!的更多相关文章
- DATE类型数据在MySql中减一天的问题
最近在开发一个教务管理系统,数据库中有教师表(Teacher).学生表(Student)等,其中属性:出生日期(Birthday)为DATE类型. 在执行更新教师操作时,发现未改动教师的出生日期但更新 ...
- MySQL能够承受上亿万条的数据量的架构
MySQL能够承受上亿万条的数据量的架构 最近做的搜索引擎的数据量是越来越大估计了下在中国可能涉及到的1Kw的数据量,就全球来说也就是1K亿而已,最初是用的数据库是MySQL现在来说要做些优化,最终使 ...
- MySQL 查询某个数据库中所有包含数据记录的表名
MySQL 查询某个数据库中所有包含数据记录的表名 有时根据实际应用需要,需要对数据进行备份. 如果一个数据库中有很多数据表,但是只想备份包含数据记录的那些表数据(空表不做数据备份). 如果通过如下S ...
- 【Spring】SpringMVC中浅析Date类型数据的传递
在控制器中加入如下代码: @InitBinder public void initBinder(ServletRequestDataBinder bin){ SimpleDateFormat sdf ...
- MySQL中游标使用以及读取文本数据
原文:MySQL中游标使用以及读取文本数据 前言 之前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课.当时只对C++感兴趣,天真的认为其它的课都没有用,数据库也是半懂不懂,胡乱就考试 ...
- debezium监听数据库变化Date类型数据的还原
debezium是一个开源的分布式CDC系统,支持对接各种数据源,将数据源中已持久化的数据变更捕获后写入消息队列. 当数据源是mysql时,debezium通过BINLOG实时捕获已提交事务数据. 在 ...
- MySQL 之存储引擎与数据类型与数据约束
一.存储引擎场景 1.InnoDB 用于事务处理应用程序,支持外键和行级锁.如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那 ...
- 《MySQL必知必会》过滤数据,数据过滤(where ,in ,null ,not)
<MySQL必知必会>过滤数据,数据过滤 1.过滤数据 1.1 使用 where 子句 在SEL ECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤. WHERE子句在表名(FR ...
- Mysql数据库备份和按条件导出表数据
Mysql数据库备份和按条件导出表数据 一.备份数据库 # mysqldump -u root -p dbcurr>/home/20090219.sql mysqldum为备份命令,- ...
随机推荐
- Android 指纹认证
安卓指纹认证使用智能手机触摸传感器对用户进行身份验证.Android Marshmallow(棉花糖)提供了一套API,使用户很容易使用触摸传感器.在Android Marshmallow之前访问触摸 ...
- 敏捷转型历程 - Sprint3 Planning
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- 编写一个通用的Makefile文件
1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...
- ASP.NET Aries 2.0 发布(原来的源码SVN已关闭,开源源码已迁移到GitHub)
主要更新: 1:增加子目录部署支持. 2:增加Taurus.MVC支持. 3:优化及Bug修复. 1:增加子目录部署支持: 其实在重写Aries框架的时候,我是去掉了目录部署功能的,主要是为了加快Ar ...
- Linux学习日记(二)
在linux上运行.Net程序 并安装Linux网站 一.环境 ubuntu14.10(桌面版 官网下载的最新版) jexus5.6.3 正式版 MonoDevloper (安装完后里面有个Ubunt ...
- 【转】ofbiz数据库表结构设计
真心不错的文章,可以加深对企业信息化的设计理解:) http://blog.sina.com.cn/s/blog_a2ca5d8c01017fa0.html http://blog.sina.com. ...
- CORS简介
现在请跟我做:在您的浏览器的地址栏中输入www.yhd.com并敲击回车.在网站内容全部加载完毕后,按F12打开浏览器的调试窗口.当切换到Sources页时,您会发现您当前所看到的一号店的页面是从多个 ...
- 【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析
目录 说明 使用Fiddler分析android版API 部分效果图 关于源码 说明 在做博客园UWP版的时候其实就有做知乎日报的打算了,前段时间一直出差,在酒店里用Fiddler简单的分析了一下An ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- ValueInjecter----最好用的OOM(以微信消息转对象举例)
使用数据实体的好处我这里就不多说了,但大家享受这些好处的时候,难免也对那些琐碎的赋值代码感到厌烦,基于此,我认为掌握一个oom的使用,还是很有必要的. 这种类型的工具有很多,比如automapper, ...