Foreach嵌套Foreach速度慢优化方案
有时候这样的效率还可以,但是只要牵涉到操作数据库,那就GAMEOVER。。
最近在维护项目,一个Foreach循环,4分半才能出来结果。
代码:
|
foreach ($content as $key => $val) { $user = $userModel->where(array('username'=>$val))->Field('id,username')->find(); if ($user) { //查找群里是否存在 if(!$ck_group_userModel->where(array('uid'=>$user['id']))->Field('uid')->find()){ $data[] = array('id'=>$user['id'],'username'=>$user['username']); } }else{ $id = $userModel->add(array('username'=>$val,'password'=>1234,'pid'=>9,'type'=>3)); $data[] = array('id'=>$id,'username'=>$val); } } |
查询时候在群中这个操作极慢!!!数据库已经添加索引。。。
考虑用户量太大,而且没有缓冲机制。只能一次次读库。
修改优化方案:
将循环查询和插入改为批量操作。减少操作数据库次数。
优化代码:
|
$userModel = M('user'); $ck_group_userModel = M('ck_group_user'); $data = array(); $where['username'] = array('in',$content); $user = $userModel->where($where)->Field('id,username')->select(); //根据java接口用户名,批量查询用户是否存在 for($i=0;$i<count($user);$i++){ $userid[$i]=$user[$i]['id']; $newuser[$i]=$user[$i]['username']; } $newuser = array_flip($newuser); $newuser = array_flip($newuser);//去重 $nouser = array_diff($content,$newuser);//不存在的用户 if($nouser){//用户不存在 foreach ($nouser as $key => $val) { $dataList[] = array('username'=>$val,'password'=>'wanxue','pid'=>9,'type'=>3);//要批量插入的数据 } $userModel->addAll($dataList); $con1['username'] = array('in',$nouser); $con1['pid'] = array('eq',$college_name['region_id']); $data = $userModel->where($con1)->Field('id,username')->select(); }else{ //查找群里是否存在 $con2['uid'] = array('in',$userid); $ingroup = $ck_group_userModel->distinct(true)->Field('uid')->select(); for($i=0;$i<count($ingroup);$i++){ $ingroup[$i]=$ingroup[$i]['uid']; } $nogroup = array_diff($userid,$ingroup); $con3['id'] = array('in',$nogroup); $data = $userModel->where($con3)->Field('id,username')->select(); } |
优化后3S出来结果。
Foreach嵌套Foreach速度慢优化方案的更多相关文章
- netty系列之:一个价值上亿的网站速度优化方案
目录 简介 本文的目标 支持多个图片服务 http2处理器 处理页面和图像 价值上亿的速度优化方案 总结 简介 其实软件界最赚钱的不是写代码的,写代码的只能叫马龙,高级点的叫做程序员,都是苦力活.那么 ...
- C# 多线程 Parallel.For 和 For 谁的效率高?那么 Parallel.ForEach 和 ForEach 呢?
还是那句话:十年河东,十年河西,莫欺少年穷. 今天和大家探讨一个问题:Parallel.For 和 For 谁的效率高呢? 从CPU使用方面而言,Parallel.For 属于多线程范畴,可以开辟多个 ...
- C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解
from:https://blog.csdn.net/li315171406/article/details/78450534 最近要做一个大数据dataTable循环操作,开始发现 运用foreac ...
- 大型php网站性能和并发访问优化方案(转载自php中文网)
网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎 ...
- 前端项目优化 -Web 开发常用优化方案、Vue & React 项目优化
github github-myBlob 从输入URL到页面加载完成的整个过程 首先做 DNS 查询,如果这一步做了智能 DNS 解析的话,会提供访问速度最快的 IP 地址回来 接下来是 TCP 握手 ...
- 大型php网站性能和并发访问优化方案
网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎么进行整体性能优化呢? ...
- 查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题
开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降. 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下. 1. ...
- Tomcat 配置详解/优化方案
转自:http://blog.csdn.net/cicada688/article/details/14451541 Service.xml Server.xml配置文件用于对整个容器进行相关的配置 ...
- 一个网站完整详细的SEO优化方案
根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...
随机推荐
- linux系统web日志分析脚本
linux系统web日志分析这方面工具比较多,比如logwatch或awstats等使用perl语言开发,功能都非常强大.但这些软件都需要进行一些配置,很多朋友往往在技术方面没有投入太多力量,即便参照 ...
- hihoCoder 第136周 优化延迟(二分答案+手写堆)
题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...
- THUSC2018 爆零记
没想到我还真能过这个...... 太玄学了= = 不过这直接导致我月考数学挂科,掉出年级前十= = 5.26 THU过了! 真是十分意外的惊喜啊$-\omega-$ 6.1 今天出发去帝都! 然而飞行 ...
- [luoguP3205] [HNOI2010]CHORUS 合唱队(区间DP)
传送门 注意到只能在两边加人,有一种区间dp的感觉. f[i][j][0/1]表示已经搞完区间[i,j]且上次搞的是左/右的方案数 那么他只能从f[i+1][j]或f[i][j-1]的某种状态得到,随 ...
- include和require的区别误区
面试时总会被问到include和require的区别,回答的时候一般也是有以下几种区别: 1.include引入文件的时候,如果碰到错误,会给出警告,并继续运行下边的代码. require引入文件的时 ...
- Codeforces Round #364 (Div. 2) C 二分处理+求区间不同字符的个数 尺取法
C. They Are Everywhere time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- vuemock数据
http://www.jianshu.com/p/ccd53488a61b dev.server.js 61 行 app.use('/mock',express.static('./mock'))
- ffmpeg nmb
搞了一个下午的raw bitstream封装无果然后转战mp4box一秒搞定了 优秀啊..
- 检测字符串当中x与o的数目是否相等
题目如上 答案 function XO(str) { var arr = str.split(""), xCount = , oCount = ; var reX = /x/i, ...
- 【04】【转】Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
目录 简介和安装 测试MySQL 认识一下Connection Options MYSQL CURD 插入 更新 查询 删除 Nodejs 调用带out参数的存储过程,并得到out参数返回值 结束数据 ...