轻易不要用多表查询,如下代码以及模拟数据测试结果能让你清晰地认识到多表查询,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. java基础学习总结(一)
  2. python 对链表进行插入排序
  3. 是什么优化让 .NET Core 性能飙升?
  4. 【学习笔记】node.js基础介绍
  5. RequireJS进阶(一) 转
  6. c语言变量radius数据类型,c语言数据类型
  7. 初识图机器学习(part1)--图的概述
  8. asp.net 获取全部在线用户_Qamp;A | 在线考试问卷答疑
  9. asp.net电子商务开发实战 视频 第二讲 (下)
  10. 数据结构与算法 —— 链表linked list(05)
  11. ASP.NET MVC View使用Conditional compilation symbols
  12. 在线数据分析4大常用功能
  13. Drupal 曝出代码执行高危漏洞,数百万网站受影响
  14. 佳能G3800黄灯绿灯交替闪烁7次,错误代码5B00
  15. 详解健康体检信息管理系统技术开发
  16. 数字图像处理第三版4.8.4例子GLPF高斯低通滤波器matlab程序
  17. 永洪BI开发脚本总结
  18. 电大计算机阅读英语作文,2018年电大作业管理英语4形成性考核册英文写作参考答案英语作文...
  19. 2020山西农业大学计算机排名,山西农业大学排名第几
  20. Vista硬盘安装详细图解

热门文章

  1. [OpenGL] 使用Assimp库的骨骼动画
  2. java:A JNI error has occurred, please check your installation and try again
  3. Error:A JNI error has occurred,please check your installation and try again
  4. c语言语法要素,第6章DSP_C语言程序设计要素.ppt
  5. PG系列3-客户端工具使用
  6. Vue 公众号商城实现浏览足迹
  7. oracle括号不区分中英,oracle查询不含括号及不含指定字符的方法
  8. Kali下卸载程序和安装程序的方法
  9. java.lang.IllegalArgumentException: Failed to decrypt.
  10. 基于java的俄罗斯方块小游戏设计(含源文件)