查看: 7125|回复: 56

[新功能] V9!如此代码质量,如何保证高负载!用事实说话

    [复制链接]
发表于 2010-10-22 09:12:15 | 显示全部楼层 |阅读模式
大概看了下V9的框架设计和代码,觉得V9的开发人员是不是有新手参与开发了?如此代码质量如何保证负载?简单举例如下:
搜索模块:搜索往往是最耗数据库资源的一个环节,因此这里程序代码编写及SQL优化一定要特别注意。
代码见:modules/content/search.php 约163行即$pagesize = 20;之后。
这里是搜索结果列表,基本原理就是用select count(*) from .......来确定符合结果的记录条数(这里按SQL优化建议,应该使用select count(id) from...要比count(*)的效率要高)。
然后根据记录总数及每页显示条数计算查询记录集合(select * from table limit x,y)。请注意,这里的前提条件是select count(*) from .......的获取的记录总数大于0的情况下才进行select * from table limit x,y查询的
如果获取符合条件的记录集总数等于0,那么select * from table limit x,y完全是多余的,是不用在去查询了。而官方根本没判断符合条件的记录是否大于零,而是继续进行第二次查询,这个问题是任何一个稍微有点经验的程序员都不应该犯的。
代码分析如下:

  1. $pagesize = 20;  //每页显示记录条数
  2. $offset = intval($pagesize*$page);  //返回获取记录的其实行数
  3.    $sql_count .= $where;   //获取select count(*) 的SQL语句,建议使用select count(id)
  4.    $this->db->query($sql_count);  //数据库查询
  5.    $total = $this->db->fetch_array();  //返回记录集
  6.    $total = $total[0]['num'];  //返回记录总数,注意,在这里应该判断$total的值是否大于0,如果等于0,下面的SQL根本没有执行的必要了
  7.    $sql .= $where;   //获取select * from。。。 的SQL语句
  8.    $order = '';  //记录集排序
  9.    $order = $_GET['orderby']=='a.id DESC' ? 'a.id DESC' : 'a.id ASC'; //记录集排序
  10.    $sql .= ' ORDER BY '.$order;   
  11.    $sql .= " LIMIT $offset,$pagesize";  
  12.    $this->db->query($sql); //查询
  13.    $datas = $this->db->fetch_array(); //返回记录集合
  14.    $pages = pages($total, $page, $pagesize); //分页
复制代码


合理的代码应该是:
  1. $pagesize = 20; //每页显示记录条数

  2. $offset = intval($pagesize*$page); //返回获取记录的其实行数
  3. $sql_count .= $where; //获取select count(*) 的SQL语句,建议使用select count(id)

  4. $this->db->query($sql_count); //数据库查询
  5. $total = $this->db->fetch_array(); //返回记录集
  6. $total = $total[0]['num']; //返回记录总数,注意,在这里应该判断$total的值是否大于0,如果等于0,下面的SQL根本没有执行的必要了
  7. $datas=array();
  8. $pages='';
  9. if($total){
  10.      $sql .= $where; //获取select * from。。。 的SQL语句
  11.      $order = ''; //记录集排序
  12.      $order = $_GET['orderby']=='a.id DESC' ? 'a.id DESC' : 'a.id ASC'; //记录集排序
  13.      $sql .= ' ORDER BY '.$order;
  14.      $sql .= " LIMIT $offset,$pagesize";
  15.      $this->db->query($sql); //查询
  16.      $datas = $this->db->fetch_array(); //返回记录集合
  17.      $pages = pages($total, $page, $pagesize); //分页
  18. }
复制代码

评分

参与人数 6鲜花 +44 收起 理由
163 + 5 不错
夜之舞 + 2 刚刚打酱油路过,发现忘记买烟了!
可乐方便面 + 2 热心鼓励
化蝶自在飞 + 10 精神可嘉,不过建议多测试. count(*) 和 co ...
也说两句 + 5 支持数主,让V9更高效
nvrenxin + 20 我很赞同

查看全部评分

发表于 2010-10-22 09:19:28 | 显示全部楼层
细节决定成败,希望V9继续完善。辛苦了。
回复 支持 反对

使用道具 举报

发表于 2010-10-22 09:37:25 | 显示全部楼层
呵呵,围观一下,支持楼主
回复 支持 反对

使用道具 举报

发表于 2010-10-22 09:40:18 | 显示全部楼层
虽然看不懂 顶你!
回复 支持 反对

使用道具 举报

发表于 2010-10-22 09:41:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2010-10-22 09:47:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2010-10-22 09:59:52 | 显示全部楼层
代码盲人速度飘过
回复 支持 反对

使用道具 举报

发表于 2010-10-22 10:01:13 | 显示全部楼层
看样子是新手比较多了。
回复 支持 反对

使用道具 举报

发表于 2010-10-22 10:09:56 | 显示全部楼层
其实对于生成静态页来说,这些也没什么。只要生成一次就好 至于负载啥的 都看服务器在生成的时候会不会卡住就可以了,但是还是优化一下比较好,你好我好大家好嘛!
回复 支持 反对

使用道具 举报

发表于 2010-10-22 10:19:40 | 显示全部楼层
顶起  支持
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-10-22 10:33:25 | 显示全部楼层
回复 9# lidong56321


    搜索页是不可能去静态化的。是实时的。
回复 支持 反对

使用道具 举报

发表于 2010-10-22 10:44:36 | 显示全部楼层
这个大的代码量,难免会有疏忽吧?
发现问题给官方提出让他们修改就是了。我们都是一些只能挑毛病写不出来的人,如果让我们自己写可能一个文件都写不出来。
另外mysql也没那么弱,这一条一句在分表情况下执行时间不足0.001秒。其实更主要的是框架的效率。
回复 支持 反对

使用道具 举报

发表于 2010-10-22 10:48:46 | 显示全部楼层
V9 人家都说了是测试版。。
问题提出来。优化一下就好了。。
好意见。。呵呵
回复 支持 反对

使用道具 举报

发表于 2010-10-22 10:49:01 | 显示全部楼层
围观..............
回复 支持 反对

使用道具 举报

发表于 2010-10-22 10:50:21 | 显示全部楼层
框架 更重要,细节以后再完善,Windows也是不断在发补丁
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 点击这里注册

本版积分规则

小黑屋|Archiver|phpcms网站管理系统 ( 京ICP备14011169 )

GMT+8, 2019-10-20 06:18 , Processed in 0.308359 second(s), 12 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表