这几天在做数据统计,有几个统计图的需求是这样的: 按照年、月、日统计订单数量, 比方一年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()效率 数据说话!的更多相关文章

  1. DATE类型数据在MySql中减一天的问题

    最近在开发一个教务管理系统,数据库中有教师表(Teacher).学生表(Student)等,其中属性:出生日期(Birthday)为DATE类型. 在执行更新教师操作时,发现未改动教师的出生日期但更新 ...

  2. MySQL能够承受上亿万条的数据量的架构

    MySQL能够承受上亿万条的数据量的架构 最近做的搜索引擎的数据量是越来越大估计了下在中国可能涉及到的1Kw的数据量,就全球来说也就是1K亿而已,最初是用的数据库是MySQL现在来说要做些优化,最终使 ...

  3. MySQL 查询某个数据库中所有包含数据记录的表名

    MySQL 查询某个数据库中所有包含数据记录的表名 有时根据实际应用需要,需要对数据进行备份. 如果一个数据库中有很多数据表,但是只想备份包含数据记录的那些表数据(空表不做数据备份). 如果通过如下S ...

  4. 【Spring】SpringMVC中浅析Date类型数据的传递

    在控制器中加入如下代码: @InitBinder public void initBinder(ServletRequestDataBinder bin){ SimpleDateFormat sdf ...

  5. MySQL中游标使用以及读取文本数据

    原文:MySQL中游标使用以及读取文本数据 前言 之前一直没有接触数据库的学习,只是本科时候修了一本数据库基本知识的课.当时只对C++感兴趣,天真的认为其它的课都没有用,数据库也是半懂不懂,胡乱就考试 ...

  6. debezium监听数据库变化Date类型数据的还原

    debezium是一个开源的分布式CDC系统,支持对接各种数据源,将数据源中已持久化的数据变更捕获后写入消息队列. 当数据源是mysql时,debezium通过BINLOG实时捕获已提交事务数据. 在 ...

  7. MySQL 之存储引擎与数据类型与数据约束

    一.存储引擎场景 1.InnoDB 用于事务处理应用程序,支持外键和行级锁.如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那 ...

  8. 《MySQL必知必会》过滤数据,数据过滤(where ,in ,null ,not)

    <MySQL必知必会>过滤数据,数据过滤 1.过滤数据 1.1 使用 where 子句 在SEL ECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤. WHERE子句在表名(FR ...

  9. Mysql数据库备份和按条件导出表数据

    Mysql数据库备份和按条件导出表数据   一.备份数据库 # mysqldump -u root -p  dbcurr>/home/20090219.sql   mysqldum为备份命令,- ...

随机推荐

  1. 根据ip判断返回城市名称查询当地天气

    <?phpheader("content-type:text/html;charset=utf-8");date_default_timezone_set("Asi ...

  2. 如何使用本地账户"完整"安装 SharePoint Server 2010+解决“New-SPConfigurationDatabase : 无法连接到 SharePoint_Config 的 SQL Server 的数据 库 master。此数据库可能不存在,或当前用户没有连接权限。”

    注:目前看到的解决本地账户完整安装SharePoint Server 2010的解决方案如下,但是,有但是的哦: 当我们选择了"完整"模式安装SharePointServer201 ...

  3. SharePoint2016安装的过程的”Microsoft.SharePoint.Upgrade.SPUpgradeException”错误解决方法

    前提 在windows server 2012的服务器上运行安装sharepoint2016出现如下错误: Could not load file or assembly ‘Microsoft.Dat ...

  4. XAMARIN.ANDROID SIGNALR 实时消息接收发送示例

    SignalR 是一个开发实时 Web 应用的 .NET 类库,使用 SignalR 可以很容易的构建基于 ASP.NET 的实时 Web 应用.SignalR 支持多种服务器和客户端,可以 Host ...

  5. 一个简单的网站web项目的详解

    有不对的术语,或者不好理解的部分,欢迎大家批评指正,谢谢大家! 近期做的网站web项目,实现登录功能,查询功能.首先把这个项目分为几个模块来处理,当前用户模块,历史用户模块,历史记录模块,数据库模块, ...

  6. MongoDB备份(mongodump)和恢复(mongorestore)

    MongoDB提供了备份和恢复的功能,分别是MongoDB下载目录下的mongodump.exe和mongorestore.exe文件 1.备份数据使用下面的命令: >mongodump -h ...

  7. 在Ubuntu下搭建Spark群集

    在前一篇文章中,我们已经搭建好了Hadoop的群集,接下来,我们就是需要基于这个Hadoop群集,搭建Spark的群集.由于前面已经做了大量的工作,所以接下来搭建Spark会简单很多. 首先打开三个虚 ...

  8. 初尝Brnshop移植到Linux Mono Jexus环境运行

    brnshop是最近社区上比较火的开源商城. Jexus是Linux上的web服务器,简单说就是Linux的iis吧.特别感谢作者宇内流云的指点 一.根据http://www.cnblogs.com/ ...

  9. Node.js实现RESTful api,express or koa?

    文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...

  10. 写自己的Socket框架(一)

    本系列仅介绍可用于生产环境的C#异步Socket框架,如果您在其他地方看到类似的代码,不要惊讶,那可能就是我在参考开源代码时,直接“剽窃”过来的. 1.在脑海里思考一下整个socket的链接的处理流程 ...