web项目优化

1 循环时没有使用break 

案例:查找一个值是否在数组中存在(为举例舍弃自带函数)

$aa=123;
$arr=array(234,123,5,6,45646,346,23);
foreach($arr as $v){
    if($aa==$v){
        dosth();
break; } }

这个是常犯的错误如果数量少或复杂度低性能没什么影响,如果遇到超大数组 那么就浪费了大量的资源

2 有时一次性将数据读取出来放入内存后处理更佳

遇到一个优化 开发者是想根据id递归查出所有的父子关系结构,每次递归都去用父id去数据库查。当时可能是数据量少 没有发现性能问题 ,但数据越来越多 每条记录都去访问一次数据库,没两下就拖垮数据库 一次业务请求却要访问成千上万次数据库

优化:如果量少 比如几万条 直接一次性获取到内存中 用完立马收回 释放内存

         如果量大 可以异步多取几次大数据

 

3 有时候用where 取代 orderby性能更佳

 案例:多个表联合查询,a,b,c  排序 order by a.status desc,b.id desc

在跨表排序时 虽然2个字段都建有索引 但没法使用到索引 会导致using temporary,using filesort   全表扫描 观察了一下数据 a.status最大的条数有几百条  即使排序出来也是几百条在前面,后面的几乎都不会去看

优化 where a.status=maxnumber order by b.id desc  可在搜索中加入按status的条件搜索 性能立马上升

 

4 有时候列表页就那么几个显示的字段 但速度特别慢,可根据情况分表处理

    将查询率高且重要的字段分表出来 可降低查询复杂度 ,尤其是字段多 数据量大的表再合适不过;

 

5 多线程抓取写入数据库时  数据库吞吐量过低阻塞抓取速度

  抓取速度快于数据库写入速度 导致数据库同步延迟并且阻塞抓取,这样的情况可以建立队列,将抓取的数据先插入队列 在慢慢写入数据库

6 不需要的数据提前过滤掉,不要在接下来一系列的操作后 才剔除  增加后面无用的查询或处理操作

7一条语句查询可完成却要循环几次去调用数据库,一般一条语句关联如果有索引且效率很高就不要分开处理了。

 

posted @ 2016-03-28 11:38  wangxusummer  阅读(334)  评论(0编辑  收藏  举报