轻易不要用多表查询,如下代码以及模拟数据测试结果能让你清晰地认识到多表查询,join,left join,inner join的可怕之处,能不用就不要用

/**

* 获取持有偶像币总估值

* @param $uid

* @return mixed

* @author zzl zzl@ourstu.com

* 时间:2019.06.18

*/

public function getHasCoinExpect($uid){

$tag='_User_total_tnk_'.$uid;

$total=S($tag);

if($total===false){

$total=0;

//获取持有偶像币估值

$page=1;//分页查询,防止某个用户拥有太多种偶像币,如管理员

$row=5000;

do{

//测试idol_coin_has表40W条记录,用户10W条记录,单次循环耗时0.1s左右

$idol_has_list=$idol_uids=$idol_price_list=array();

$price=$has_num=0;

$idol_has_list=$this->where(array('uid'=>$uid,'has_num'=>array('gt',0)))->page($page,$row)->order('has_num desc,idol_uid asc')->getField('idol_uid,has_num');

$idol_uids=array_keys($idol_has_list);

$idol_price_list=D('Idol/Idol')->where(array('uid'=>array('in',$idol_uids),'single_price'=>array('gt',0),'status'=>1))->getField('id,uid,single_price');//这里增加single_price字段,初始化时为0,有交易时改变

foreach ($idol_price_list as $vo){

$price=$vo['single_price'];

$has_num=$idol_has_list[$vo['uid']];

$total=bc_add(bc_mul($has_num,$price,4),$total,4);

}

unset($vo);

$page++;

}while(count($idol_has_list)==$row);

S($tag,$total,60);

//测试idol_coin_has表40W条记录,要查询用户的偶像币持有条数有10W条记录,总耗时1.5~2.5s之间

}

return $total;

//如下注释方案,采用inner join方式 测试idol_coin_has表40W条记录,用户10W条记录,直接崩溃,无响应,所以舍弃该方案

/*if(1||$total===false){

$total=0;

//获取持有偶像币估值

$page=1;//分页查询,防止某个用户拥有太多种偶像币,如管理员

$row=500;

G('d');

$sql="select

table1.uid,table1.idol_uid,table1.has_num,table2.single_price

from

__PREFIX__idol_coin_has as table1

inner join __PREFIX__idol_info as table2

on

table1.uid={$uid} AND table1.has_num>0 AND table2.single_price>0 AND table1.idol_uid = table2.uid

ORDER BY table1.has_num desc,table2.single_price desc ";

do{

G('a');

$sql_do=$sql."limit ".($page-1)*$row.",".$row;

$list=$this->query($sql_do);

foreach ($list as $val){

$total=bc_add(bc_mul($val['has_num'],$val['single_price'],4),$total,4);

}

unset($val);

dump($total);

dump($page);

$page++;

G('b');

dump(G('a','b'));

}while(count($list)==$row);

dump('e');

dump(G('d','e'));exit;

S($tag,$total,60);

}*/

}

对于大批量的操作,千万不要在foreach中出现sql查询,如下代码:

一条一条save的方案,每条操作都要0.01s左右,10W条的话,需要100s,是当前方案耗时的10倍,所以这里采用删除老记录,批量新增新记录的方式操作

/**

* 重新计算排名

* @return boolean

* @author 郑钟良(zzl@ourstu.com)

* @date slf

*/

private function _calculateRanking()

{

$heatModel=D('idol_heat');

$map['status']=1;

$order='heat desc,uid asc';

$page=1;

$row=5000;

$rank=1;

$this->startTrans();

do{

//用9W条数据测试,如果每条都需要改,单次循环需要0.55s,全部执行完需要11s左右

//用9W条数据测试,如果有1W条数据需要改,单次循环需要0.15s,全部执行完需要3s左右

//实际使用环境中,每次改变不会超过十分之一,而且总用户量很难达到10W,所以,该方案可行

$heatList=$heatModel->where($map)->order($order)->page($page,$row)->select();

$rank_list=$del_ids=array();

foreach ($heatList as $val){

if($val['last_rank']!=$val['rank']||$val['change_rank']!=$rank-$val['rank']||$val['rank']!=$rank){

$val['last_rank']=$val['rank'];

$val['change_rank']=$rank-$val['rank'];

$val['rank']=$rank;

$rank_list[]=$val;

$del_ids[]=$val['uid'];

}

$rank++;

}

unset($val);

if(count($del_ids)){

//一条一条save的方案,每条操作都要0.01s左右,10W条的话,需要100s,是当前方案耗时的10倍,所以这里采用删除老记录,批量新增新记录的方式操作

$res=$heatModel->where(array('uid'=>array('in',$del_ids)))->delete();

$res1=$heatModel->addAll($rank_list);

}else{

$res=1;

$res1=1;

}

if(!$res||!$res1){

break;

}

$page++;

}while(count($heatList)==$row);

if($res&&$res1){

if($this->commit()){

return true;

}

}else{

$this->rollback();

}

return false;

}

Php 网站性能优化,关于ThinkPHP中网站性能优化研究相关推荐

  1. html中图片的属性优化,源码中图片seo优化的技巧是什么

    Seo网站站内结构优化,html中有关图片alt属性与h1标记的优化细节技巧,内蒙古网络营销师蒋元今天可大家一起来聊一下吧! SEO优化,相信大家都觉得优化的每个点都不陌生,但往往在优化过程中却忽略的 ...

  2. mysql索引的使用及优化方法_MySQL中索引和优化的用法总结

    1.什么是数据库中的索引?索引有什么作用? 引入索引的目的是为了加快查询速度.如果数据量很大,大的查询要从硬盘加载数据到内存当中. 2.InnoDB中的索引原理是怎么样的? InnoDB是MySQL的 ...

  3. 计算机网络时延图,计算机网络中网站性能延迟加载图像的示例分析

    计算机网络中网站性能延迟加载图像的示例分析 发布时间:2021-06-09 11:38:56 来源:亿速云 阅读:95 作者:小新 这篇文章给大家分享的是有关计算机网络中网站性能延迟加载图像的示例分析 ...

  4. 高性能网站建设进阶指南:Web开发者性能优化最佳实践 pdf扫描版

    高性能网站建设进阶指南:Web开发者性能优化最佳实践是<高性能网站建设指南>姊妹篇.作者Steve Souders是Google Web性能布道者和Yahoo!前首席性能工程师.在本书中, ...

  5. 制作移动端手机网站过程中的SEO优化方法技巧

    据国内三大运营商数据来看,中国的手机用户数已达10亿,超过2/5的移动用户每个月都会从手机终端访问网页,如今的移动端手机网站比例肯定有提升,但是对于这些存在的移动版本网站来说,马海祥查看了很大一部分手 ...

  6. 如何网络推广浅析网站优化的过程中首页降权了该怎么办?

    如何网络推广中网站排名优化就是为了让网站能更受欢迎,能吸引到更多的流量,进而促进网站的效益等,并且首页的优化在整个网站优化过程中也是非常重要的,有时候就会引起优化人员的过度重视,从而造成了过度优化,导 ...

  7. 商丘网络推广中网站内部优化需要注意的要点有哪些?

    商丘网络推广表示想要网站优化效果更突出,做好内部优化是关键.众所周知,网站内部优化做的好会有效的帮助网站提升排名和权重,提升企业竞争力,为企业带来更高的转化率,那么对于网站内部优化都需要注意哪些问题呢 ...

  8. 网络推广软文浅谈网站优化过程中图片的优化技巧和注意事项!

    在网站优化的过程中,网络推广软文介绍到不仅要做好关键词的优化,也更要做好图片优化,在网站不断地利用图文模式时,做好图片优化对网站的排名提升也有很大的帮助.那么对于图片优化都有哪些技巧呢?下面网络推广软 ...

  9. 武汉网络推广优化中网站关键词如何更合理布局分布?

    在网站SEO优化中,站长们非常重视关键词,武汉网络推广解释那是因为它能起到的作用非同一般.其中,关键词优化的程度时最难把握的,因为过度或是不够都会给网站带来不好的影响,那么对于网站关键词该如何更合理的 ...

最新文章

  1. Introduction to Django(The Definitive Guild to Django)
  2. Ubuntu 14.04上使用CMake编译MXNet源码操作步骤(C++)
  3. Zynq器件XADC模块介绍
  4. java agent_GitHub - dingjs/javaagent: 基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志。...
  5. 清华团队研发,首款国产电力电子仿真软件来啦~已捐赠哈工大、海工大、清华使用!...
  6. php 过滤微信符号昵称,PHP方法处理微信昵称特殊符号过滤
  7. 领域应用 | 人工智能+知识图谱:如何规整海量金融大数据?
  8. JAVA记录-SpringMVC scope属性的两种模式
  9. Mysql-2-数据库基础
  10. AD转换原理,器件与参数
  11. 如何下载专利(国内)
  12. 影子内存(Shadow RAM)介绍_4
  13. 开源的视频编解码器介绍
  14. php 解析mpp 格式文件
  15. 【概率论】4-7:条件期望(Conditional Expectation)
  16. 微应用 qiankun 项目搭建
  17. HC-SR04模块初始化
  18. 使用stl::string去除字符串前后的空白
  19. 用 C++ 示例解释 UML 类图
  20. 区块链对抑制公共部门的腐败有什么作用?

热门文章

  1. git pull报错error: You have not concluded your merge (MERGE_HEAD exists).
  2. 技巧|微信个性签名,汽车手动挡效果,你喜欢这样的吗?
  3. #超全#行人重识别数据集整理,附下载链接和介绍
  4. 语音科学计算机,CalcVoice(语音科学计算器)
  5. OccuSeg: Occupancy-aware 3D Instance Segmentation
  6. requests爬取豆瓣前250部高分电影
  7. redis_主从复制搭建
  8. 【办公】罗技设备(基于M590)使用方法
  9. Linux系统的grub.cfg文件损坏修复
  10. SONY索尼PXW-X280摄像机断电MXF/RSV视频文件损坏修复技术