有时候这样的效率还可以,但是只要牵涉到操作数据库,那就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速度慢优化方案的更多相关文章

  1. netty系列之:一个价值上亿的网站速度优化方案

    目录 简介 本文的目标 支持多个图片服务 http2处理器 处理页面和图像 价值上亿的速度优化方案 总结 简介 其实软件界最赚钱的不是写代码的,写代码的只能叫马龙,高级点的叫做程序员,都是苦力活.那么 ...

  2. C# 多线程 Parallel.For 和 For 谁的效率高?那么 Parallel.ForEach 和 ForEach 呢?

    还是那句话:十年河东,十年河西,莫欺少年穷. 今天和大家探讨一个问题:Parallel.For 和 For 谁的效率高呢? 从CPU使用方面而言,Parallel.For 属于多线程范畴,可以开辟多个 ...

  3. C# 多线程 Parallel.ForEach 和 ForEach 效率问题研究及理解

    from:https://blog.csdn.net/li315171406/article/details/78450534 最近要做一个大数据dataTable循环操作,开始发现 运用foreac ...

  4. 大型php网站性能和并发访问优化方案(转载自php中文网)

               网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎 ...

  5. 前端项目优化 -Web 开发常用优化方案、Vue & React 项目优化

    github github-myBlob 从输入URL到页面加载完成的整个过程 首先做 DNS 查询,如果这一步做了智能 DNS 解析的话,会提供访问速度最快的 IP 地址回来 接下来是 TCP 握手 ...

  6. 大型php网站性能和并发访问优化方案

    网站性能优化对于大型网站来说非常重要,一个网站的访问打开速度影响着用户体验度,网站访问速度慢会造成高跳出率,小网站很好解决,那对于大型网站由于栏目多,图片和图像都比较庞大,那该怎么进行整体性能优化呢? ...

  7. 查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题

    开发经常遇到分页查询的需求,但是当翻页过多的时候,就会产生深分页,导致查询效率急剧下降. 有没有什么办法,能解决深分页的问题呢? 本文总结了三种优化方案,查询效率直接提升10倍,一起学习一下. 1. ...

  8. Tomcat 配置详解/优化方案

     转自:http://blog.csdn.net/cicada688/article/details/14451541 Service.xml Server.xml配置文件用于对整个容器进行相关的配置 ...

  9. 一个网站完整详细的SEO优化方案

    根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...

随机推荐

  1. Java之implements

    转自:https://blog.csdn.net/android_lover2014/article/details/52176814 JAVA中extends 与implements有啥区别?1. ...

  2. 前端构建工具gulpjs的使用介绍及技巧(转)

    http://www.cnblogs.com/2050/p/4198792.html gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学 ...

  3. Linux系统——访问U-BOOT环境变量

    Linux系统下访问U-BOOT环境变量 移植过U-BOOT的人,都知道:在U-BOOT中存有ENV.但U-BOOT在引导内核启动之后,U-BOOT的生命周期就结束了.那么启动LINUX内核之后,U- ...

  4. 问题:viewController不会调用dealloc()不会销毁

    问题 在调试程序时,我从ViewController A push进 ViewController B,在从B back时发现程序不会执行B里面的dealloc(),很诡异的问题,因为按理说此时点击b ...

  5. MySQL不容忽视SQL_MODE的设置

    CREATE DATABASE db_test; CREATE TABLE `tb1` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ...

  6. BZOJ 1497: [NOI2006]最大获利

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4572  Solved: 2239[Submit][Status] ...

  7. 极致 Web 性能 —— SPA 性能指南

    前言 前端框架时代,为开发体验.效率与页面性能带来,非常大的革命.大家纷纷拿起一系列打包工具(webpack/parcel etc.),配合一系列加载器快速搭建起一个 SPA 页面. SPA 应用带来 ...

  8. 转 C++的常量引用

    C++的常量引用 如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对常量的引用可以用其它任何引用来初始化:但不能改变. 关 ...

  9. Android开发基础(java)1

    基本概念: 一.结构化方法与结构化程序设计 1.结构化方法:源自迪克斯特拉(E.W.Dijkstra)提出的结构化概念,采用自顶向下.逐步求精的模块化设计方法.核心是将工作分成若干个相互独立的模块,使 ...

  10. (5)centos图形界面安装

    1.登录 2.先安装MATE可视化桌面 yum groups install "MATE Desktop" 选择y 3.安装X Window System:图形接口 yum gro ...