关于MySQL性能的比较
需求:在传递一组职位编号的时候,需要统计该职位的 当天的投递情况 和 有历史记录以来总的投递量
解决方案一:
每次都进行一次数据库查询,遍历职位id,再根据职位id去查询相应时间内的投递量
- /**
- * [exportData 导出相应职位的投递量]
- * @param [array] $params [需要查询的职位id,时间等]
- * @return [array] [相应职位id的投递量]
- */
- public function exportData($params){
- //进行数据库查询 [查询所要导出的数据]
- $getWhere = '1 =1';
- //开始时间和结束时间
- if( (isset($params['start_date']) && $params['start_date']) && (isset($params['end_date']) && $params['end_date']) ){
- $getWhere.=" and `addtime` between '{$params['start_date']}' and '{$params['end_date']}' ";
- }
- $jobidsArr = explode("," , $params['jobids']);
- $count = [];
- $dealCount = [];
- $actionTotal = [];
- $actionDealTotal = [];
- foreach ($jobidsArr as $key => $value) {
- $sql = "SELECT count(*) as count from hr_action where jobid = ".$value. " and ".$getWhere;
- $count[$key] = $this->db->findOne($sql);//返回数组
- //获取当天的处理状态
- $sqlDeal = "SELECT count(*) as count from hr_action where jobid = ".$value. " and `astatus` > 0 and ".$getWhere;
- $dealCount[$key] = $this->db->findOne($sqlDeal);//返回数组
- //总职位数和总处理情况进行查询
- $sqlTotal = "SELECT count(*) as count from hr_action where jobid = $value";
- $actionTotal[$key] = $this->db->findOne($sqlTotal);
- $sqlDealTotal = "SELECT count(*) as count from hr_action where jobid = $value and `astatus` > 0";
- $actionDealTotal[$key] = $this->db->findOne($sqlDealTotal);
- }
- foreach ($count as $ckey => $cvalue) {
- $actionCount[$ckey] = $cvalue['count'];
- }
- foreach ($dealCount as $dkey => $dvalue) {
- $actionDealCount[$dkey] = $dvalue['count'];
- }
- foreach ($actionTotal as $atkey => $atvalue) {
- $actionTotalCount[$atkey] = $atvalue['count'];
- }
- foreach ($actionDealTotal as $adtkey => $adtvalue) {
- $actionDealTotalCount[$adtkey] = $adtvalue['count'];
- }
- return ['jobid'=> $jobidsArr , 'actionCount'=> $actionCount , 'actionDealCount' => $actionDealCount , 'actionTotalCount'=>$actionTotalCount,'actionDealTotalCount'=>$actionDealTotalCount];
- }
以上这种方法思路确实很简单,但是仔细查看,在运行的时候可以算一下进行了多少次的数据库查询,每一次的foreach循环都会进行四次查询数据库,当我一次传递30个职位的时候,就是4*30 次数据库查询了,由于数据库中的数量比较大,每次都全部便利一次这样的查询不满才怪呢。咳咳咳咳。。
方法二:尽量的减少数据库的查询,对数据库的操作越少越好。为什么不在第一次遍历投递情况的时候,把所有的投递情况都遍历出来保存到一个数组中,然后对数组进行操作,把对数据库的操作转换成php在内存中操作,这样不是挺好的吗?
因此,首次遍历的时候利用in 查询,把所有的投递情况都查询出来。
- /**
- * [exportData 导出相应职位的投递量]
- * @param [array] $params [需要查询的职位id,时间等]
- * @return [array] [相应职位id的投递量]
- */
- public function exportData($params){
- //进行数据库查询 [查询所要导出的数据]
- $getWhere = '1 =1';
- //开始时间和结束时间
- if( (isset($params['start_date']) && $params['start_date']) && (isset($params['end_date']) && $params['end_date']) ){
- $getWhere.=" and `addtime` between '{$params['start_date']}' and '{$params['end_date']}' ";
- }
- $jobids = $params['jobids'];//获取传入的职位id
- $jobidsArr = explode("," , $params['jobids']);
- //根据职位id来查询相应的职位信息和公司信息
- $sqlInfo = "SELECT j.`title`,j.`id` from hr_job as j where id in ($jobids)";
- $jobTitle = $this->db->find($sqlInfo);
- $sqlCompany = "SELECT c.`comname`,j.`id` from hr_company as c right join hr_job as j on j.`user_id` = c.`user_id` where j.`id` in ($jobids)";
- $jobCompany = $this->db->find($sqlCompany);
- //print_r($jobTitle);
- $newjobTemp = [];
- foreach ($jobTitle as $key => $value) {
- $newjobTemp[$value['id']] = $value['title'];
- }
- $companyTemp = [];
- foreach ($jobCompany as $key => $value) {
- $companyTemp[$value['id']] = $value['comname'];
- }
- //print_r($newjobTemp);
- //
- //
- /*************总职位数和总处理情况进行查询*************/
- $sqlTotal = "SELECT `jobid`,`addtime` ,`astatus` from hr_action where jobid in ($jobids)";
- $sqlDealTotal = "SELECT `jobid`,`addtime` ,`astatus` from hr_action where jobid in ($jobids) and ".$getWhere;
- $retTotal = $this->db->find($sqlTotal);//返回总数
- $retDealTotal = $this->db->find($sqlDealTotal);//返回当天处理总数
- /*************总职位数和总处理情况进行查询*************/
- $temp1 = [];
- foreach ($retTotal as $ckey => $cvalue) {
- $temp1[$ckey] = $cvalue['jobid'];
- }
- $actionCount1 = array_count_values($temp1);
- //print_r($actionCount1);//投递总数
- $temp2 = [];
- foreach ($retTotal as $dkey => $dvalue) {
- $temp2[$dkey] = [$dvalue['astatus'],$dvalue['jobid']];
- }
- //print_r($temp2);
- $temp3 = [];
- foreach ($retDealTotal as $atkey => $atvalue) {
- $temp3[$atkey] = $atvalue['jobid'];
- }
- $actionCount3 = array_count_values($temp3);
- //print_r($actionCount3);
- $temp4 = [];
- foreach ($retDealTotal as $adtkey => $adtvalue) {
- $temp4[$adtkey] = [$adtvalue['astatus'],$adtvalue['jobid']];
- }
- //print_r($temp4);
- //按照预定义格式输出
- $actionCount = [];//总投递量
- $actionDayCount = [];//当天投递总量
- $adealCount = [];//定义一个新数组,存放相对应的总处理量
- $adaydealCount = [];//定义一个新数组,存放相对应的当天总处理量
- $actionDealCount = [];//存放转换后的总处理量
- $actionDayDealCount = [];//存放转换后的当天处理量
- $actionJobTitle = [];//职位名称
- $actionJobCompany = [];//公司名称
- foreach ($jobidsArr as $key => $value) {//循环传入的IDS
- $i = ;
- foreach ($temp2 as $t2key => $t2value) {
- if ($value == $t2value[]) {
- if ($t2value[] > ) { $i++; }
- }
- $adealCount[$value] = $i;
- }
- $j = ;
- foreach ($temp4 as $t4key => $t4value) {
- if ($value == $t4value[]) {
- if ($t4value[] > ) { $j++; }
- }
- $adaydealCount[$value] = $j;
- }
- $actionCount[$key] = $actionCount1[$value];
- $actionDayCount[$key] = isset($actionCount3[$value])?$actionCount3[$value]:;
- $actionDealCount[$key] = $adealCount[$value];
- $actionDayDealCount[$key] = $adaydealCount[$value];
- $actionJobTitle[$key] = $newjobTemp[$value];
- $actionJobCompany[$key] = $companyTemp[$value];
- }
- // print_r($actionJobTitle);
- /* print_r($actionCount);//总投递量
- print_r($actionDayCount);//当天投递总量
- print_r($actionDealCount);//总处理量
- print_r($actionDayDealCount);//当天处理量*/
- return ['jobid'=> $jobidsArr , 'actionCount'=> $actionCount , 'actionDealCount' => $actionDealCount , 'actionDayCount'=>$actionDayCount,'actionDayDealCount'=>$actionDayDealCount,'actionJobTitle'=>$actionJobTitle , 'actionJobCompany'=>$actionJobCompany];
- }
导出数据,都是使用的同一套方法
- //导出相应职位的投递情况
- public function exportData($params = array()){
- /*[start_date] => 2016-11-23 12:09:05
- [end_date] => 2016-11-24 12:09:07
- [jobids] => 12,23,234,345,345,4564,5646*/
- /*echo "<pre>";
- print_r($params);*/
- $jobModel = new joblist_jobModel();
- $job_action_count = $jobModel->exportData($params);
- ini_set('memory_limit','500M');
- set_time_limit();
- $jobids = $job_action_count['jobid'];//查询的职位id
- $actionDayCount = $job_action_count['actionDayCount'];//当天的投递量
- $actionDayDealCount = $job_action_count['actionDayDealCount'];//当天处理量
- $actionCount = $job_action_count['actionCount'];//总投递量
- $actionDealCount = $job_action_count['actionDealCount'];//总处理量
- $actionJobTitle = $job_action_count['actionJobTitle'];//职位标题
- $actionJobCompany = $job_action_count['actionJobCompany'];//企业名称
- if(empty($jobids)){
- exit("暂无数据");
- }
- $temp = [];
- foreach ($jobids as $key => $value) {
- $temp[$key] = [$value,$actionJobCompany[$key],$actionJobTitle[$key],$actionDayCount[$key], $actionDayDealCount[$key], $actionCount[$key], $actionDealCount[$key]];
- }
- /*print_r($temp);
- exit;*/
- $column_name = array();
- header ( "Content-type:application/vnd.ms-excel" );
- header ( "Content-Disposition:filename=" . iconv ( "UTF-8", "GBK", date("Y-m-d_H_i_s" , time())."-".rand(,) ) . ".csv" );
- // 打开PHP文件句柄,php://output 表示直接输出到浏览器
- $fp = fopen('php://output', 'a');
- $head = ['职位编号','企业名称','职位名称','当天的投递量','当天的处理量','总投递量','总处理量'];
- foreach ($head as $i => $v) {
- $column_name[$i] = iconv('utf-8', 'GBK', $v);
- }
- fputcsv($fp, $column_name);
- foreach ($temp as $tkey => $tvalue ) {
- $rows = array();
- foreach ($tvalue as $newkey => $newvalue) {
- $rows[] = iconv('utf-8', 'GBK', $newvalue);
- }
- fputcsv($fp, $rows);
- }
- ob_flush();
- flush();
- die();
- }
关于MySQL性能的比较的更多相关文章
- [原] KVM 环境下MySQL性能对比
KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...
- Mysql - 性能优化之子查询
记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...
- Mysql性能优化三(分表、增量备份、还原)
接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...
- Mysql性能优化二
接上一篇Mysql性能优化一 建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千 ...
- Mysql性能优化一
下一篇:Mysql性能优化二 mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包 ...
- [MySQL性能优化系列]提高缓存命中率
1. 背景 通常情况下,能用一条sql语句完成的查询,我们尽量不用多次查询完成.因为,查询次数越多,通信开销越大.但是,分多次查询,有可能提高缓存命中率.到底使用一个复合查询还是多个独立查询,需要根据 ...
- [MySQL性能优化系列]巧用索引
1. 普通青年的索引使用方式 假设我们有一个用户表 tb_user,内容如下: name age sex jack 22 男 rose 21 女 tom 20 男 ... ... ... 执行SQL语 ...
- MySQL性能优化:索引
MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...
- mysql 性能优化方向
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- MySQL性能优化总结
一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...
随机推荐
- 从外部导入jar包的三种方式
我们在用Eclipse开发程序的时候,经常要用到第三方jar包.引入jar包不是一个小问题,由于jar包位置不清楚,而浪费时间.下面配图说明3种Eclipse引入jar包的方式. 1.最常用的普通操作 ...
- jquery判断表单提交是否为空
<input type="text" value="" name="toPage"> 判断该表单是否为空 var p = $(& ...
- grep;egrep;fgrep
-1 使用场景:搜索定位内容并输出(所在行) -2 三者区别: --1 grep 默认支持普通正则 --2 egrep 默认支持扩展正则 等同于 grep -E --3 fgrep 速度最快,不支持 ...
- MFC与Qt的内存管理
最近在做MFC向Qt的移植,在内存管理方面遇到了很头疼的问题,虽然不知道问题到底出在哪,先了解下这两个库的内存管理方式.于是转载两篇关于内存管理的文章. 一. Qt内存管理: 在Qt的程序中经常会看到 ...
- canvas.js | CLiPS
canvas.js | CLiPS canvas.js The canvas.js module is a simple and robust JavaScript API for the HTML5 ...
- ERROR: HHH000388: Unsuccessful: create table
做SSH整合的时候,总是出现错误信息: 类似这样: : HHH000388: Unsuccessful: create table right (right_code varchar(255) not ...
- 什么是FastCGI?
什么是FastCGI? PHP的FastCGI使你的所有php应用软件通过mod_fastci运行,而不是mod_phpsusexec.FastCGI应用速度很快 是因为他们持久稳定.不必对每一个请求 ...
- UGUI Scrollbar控件
如题就是Scrollbar控件,它简单可以看成 Scrollbar 和 Image组件组成 它基本上不单独使用多数是制作滚动视图.我们来看看他独特的属性,重复的属性就不在介绍了! 属性讲解: Hand ...
- 实现一次请求加载多个js或者css
http://tengine.taobao.org/ 相当牛x
- DOS窗口中文显示乱码
记得以前的dos是可以显示中文的,但是今天复制东西发现竟然不能显示中文了,遇见中文就成了? 在右键->默认值中的默认代码页也显示有中文GBK,但是不管用 在右键->属性中的当前代码页显示为 ...