当前位置:编程学习 > php >>

php+mysql优化

这段代码在mysql里有45万条数据,执行时间太长,有没办法优化?


$mod1 = array('134','135','136','137','138','139','147','187','188','182','150','151','152','157','158','159');
$mod2 = array('130','131','132','155','156','185','186');
$mod3 = array('133','153','189','180');
$ali = 0;
$query = DB::query("SELECT mobile FROM ".DB::table('common_member_profile')." WHERE mobile!=''  ");
 while($val = DB::fetch($query)) {
 $ali = $ali+1; 
    $lim1 = strlen($val[mobile])<11 ? $lim1+1 : $lim1;
 if(strlen($val[mobile])>10){ 
      $obl = substr($val[mobile],0,3);
    $yid = in_array($obl,$mod1) ? $yid+1 : $yid ;
 $liant = in_array($obl,$mod2) ? $liant+1 : $liant ;
 $dxin = in_array($obl,$mod3) ? $dxin+1 : $dxin ;
 //if(in_array($obl,$mod1)){$yid=$yid+1;} 
 //if(in_array($obl,$mod2)){$liant=$liant+1;} 用if比三元慢点
 //if(in_array($obl,$mod3)){$dxin=$dxin+1;}  
 }
 }
 
$qit = ($ali-$lim1)-($yid+$liant+$dxin);
$bbf = $ali-$lim1;
$yidb = round(($yid/$bbf)*100,2);
$liantb = round(($liant/$bbf)*100,2);
$dxinb = round(($dxin/$bbf)*100,2);
$qitb = round(($qit/$bbf)*100,2);

$mail = array('1'=>'gmail.com','2'=>'yahoo.com','3'=>'msn.com','4'=>'hotmail.com','5'=>'aol.com','6'=>'live.com','7'=>'yeah.net','8'=>'googlemail.com','9'=>'mail.com','10'=>'126.com','11'=>'163.com','12'=>'sina.com','13'=>'sina.cn','14'=>'21cn.com','15'=>'sohu.com','16'=>'yahoo.com.cn','17'=>'tom.com','18'=>'qq.com','19'=>'etang.com','20'=>'eyou.com','21'=>'56.com','22'=>'chinaren.com','23'=>'sogou.com','24'=>'wo.com.cn','25'=>'189.cn','26'=>'139.com','27'=>'163.net','28'=>'263.net','29'=>'100.com','30'=>'其他');
$query = DB::query("SELECT email FROM ".DB::table('ucenter_members')." ");
 while($val = DB::fetch($query)) {
$mai = explode('@',$val[email]);
$a = array_keys($mail,$mai[1]);
if($a[0]=="" || $a[0]<1 || $a[0]>29){$a[0]=30;}
$ma[$mail[$a[0]]] = $ma[$mail[$a[0]]]+1;
 } 
$mais = array(); 
foreach($mail as $val){
 $mais[] = $val;
 }

答案:上一半,楼主的意思是要统计三个运营商的手机号码数量,可以在SQL上做优化。

将手机号码为空的排除掉,将手机号码取左边三位,按手机号码左三位的结果来分组查询:

select left(mobile,3) as mobile_le, count(mobile) as num from 表 where mobile !='' group by mobile_le

这样查询出来的结果就非常有限的了。现在要解决的问题就是这句SQL执行效率问题。由于你要对手机号码左三位统计,所以最好这样做:加一个字段,叫“left_three”,然后建索引,以后写入的时候就多加一下处理。现在加字段,以前的数据就可以用SQL语句来补回新字段的数据。由于数据量大,可以分批处理(update语句里加where left_three ='' limit 1000).

 

下面的是统计邮箱的,同样的道理去做。

 

像你这样的统计需求,不能靠蛮力解决的。

php5.4之前if是比三目快的,参考 http://www.laruence.com/

上一个:如何快速学php
下一个:PHP基础问题 ... ...

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,