我写了个php只读论坛性质的东西,听我慢慢说来
我有2个表tab1,tab2tab1是这样的
tid(发言id)ttitle(发言主题)
1             你好1
2             你好2
3             你好3
……
tab2是这样的
tid(发言id) tdetail(跟贴主题)
1            你好11
1            你好12
2            你好22
2            你好22
……
为了明确目的,省略了些东西我用php是这么操作的
1.连接数据库
2.取tab1的清单到数组中
3.关闭数据库(123步封装在function中,返回一个数组)
4.用foreach(数组)循环
5.显示foreach的tid和ttitle
6.打开数据库
7.读取tab2中tid和foreach数组中tid一样的跟贴主题并显示
8.关闭数据库(678步封装在function中,返回一个数组)
9.循环到5,完毕后到10
10.完成我把所有的操作都封装到function中,function中以连接数据库开始,关闭数据库结束(没有用类),所以必须用数组才能有返回值(我这么认为的,囧)
可能是我编程的思想不对,造成了mysql和php占用cpu总计高达100%
不知道各位怎么看?

解决方案 »

  1.   

    忘记说数据量了
    tab1中不到20条,tab2中平均每个tab1的tid对应200-700条,tab2共10000多条
      

  2.   

    打开和关闭数据库只要在程序开始和结束时执行一次即可
    你的论坛是否有分页,以及页面显示多少内容
    而不论是否有分页,常见的逻辑如下一个页面专门显示tab1的列表,只要执行2
    点击打开新页面
    显示帖子,只要执行7如果你想直接把帖子内容显示在第一个页面,那可以循环读取tab1的数据取得tid再去以此为条件做一次查询
    类似$tids = array();
    foreach($tab1rows as $row)
        $tids[] = $row['tid'];$sql = 'SELECT * FROM `tab2` WHERE tid IN ('.implode(', ', $tids).')';
    而不是每次循环去执行一次select tid = $row['tid'];
      

  3.   

    select t1.*,t2.tdetail from tab1 t1,tab2 t2 where t1.tid=t2.tid
    然后数组遍历一遍结果集
    foreach((array)$rs as $k=>$v)
    {
       $topic[$v['tid']] = $v;
       $topic[$v['tid']]['reply'][] = array('tdetail '=>$v['tdetail ']);
    }
    然后遍历$topic,相应读出$topic的reply,显示.牺牲空间换取读mysql的消耗,要不每循环一个主题就搜索一次,就是*2的搜索量。
      

  4.   

    优化SQL指令
    因无代码,无法做出细致的指导
      

  5.   

    找到一个问题:tmp空间只有16m,扩展到200m,cpu最高在70-90%了我整理下发sql语句
      

  6.   

    sql语句来了tab1 
    name  num  order_id(1,2,3,4,5,6,……) 
    张三  10        0 
    张三  10        1 
    张三  11        0 
    张三  11        1 
    张三  12        0 
    张三  13        1 
    为了让看得清楚,李四等其他记录就列一条 
    李四  12        1 
    数据量大约100万左右,这个表要怎么建立索引?然后想用一条语句取得如下效果 
    张三  12        0 
    张三  13        1 
    张三  11        0 
    张三  11        1 
    张三  10        0 
    张三  10        1 
    也就是order_id交叉排列,num按每个order_id从大到小排列 
    以前csdn有朋友给出如下语句 
    select * from tab1 a where name='张三' order by (select count(*) from tab1 where order_id=a.order_id and num>a.num and name='张三'),order_id desc 
    但是经过测试,这条语句在3000数据量下选500条就会出现cpu峰值占到90%的现象