一个广告系统,用JS调用PHP然后分布于网页的各个位置。 
<script type="text/javascript" src="/ads.php?id=1"> </script> 因要求要统计单一广告的流量及访客来路、时间等数据,所以在ads.php这个页面有着很多的数据处理,一个广告位置最少有3次以上的数据库操作,而一个页面平均都有5、6个广告位,也就是说每打开一个页面都要有十几次的数据库操作行为,频繁的数据操作导致服务器不堪重负。 觉得目前这个做法不合理,但没想到什么好方法,希望能获得一些好建议。不管是整体优化方案还是单句SQL优化都行,谢谢!
ads.php的过程大致为: 一,获取广告,在一个广告位表里随机抽一条,一个广告位下有数个广告。 
SELECT id,.... FROM ads WHERE id='$id' ORDER BY RAND() LIMIT 1二,显示广告,判断一些条件后显示出来,判断条件不是很复杂。 
echo ......三,更新该广告的浏览量,与查询的同一张表 
UPDATE ads SET views=views+1 WHERE id='$id'四,加入统计表(也是最耗资源的一步,每天都有近万条记录入表) 
判断加入统计表,就是先update,没返回再用insert,觉得这样可节省点表行数,也就是说相同广告位、相同IP、同一天内直接加数量就行了,不插入新记录。这一步具体的代码是:
//判断更新或插入 统计表
$db->update("UPDATE adstat SET views=views+1 WHERE userip='$userip' AND adid='$id' AND DATE(NOW())=DATE(ptime) ORDER BY id DESC LIMIT 1");
if(!$db->affected_rows()) {
    $db->insert("INSERT INTO adstat (ptime,userip,ipaddr,adid,views) VALUES (now(),'$userip','$ipaddr','$id',1)");
}
这个统计表才用了一周就已有8万多的记录了,实在是令人担忧。 
像首页如有10个广告位,每打开一次首页就要操作30次数据库,连静态页都变得慢了,太郁闷了! 我现在能想到的仅是把第一步查询那里缓存下来,其它的尚未想到解决方法。期待指点! 在PHP版发问时有个朋友说可用SQL延迟执行, 一页一句SQL 就跑完了,可我不明白SQL延迟执行,手册也没找到相关说明,如有操作过的朋友烦请指点一下。

解决方案 »

  1.   

    这广告也太多了吧,
    看看这里http://info.mysql.cn/install/2006/0316/232.html,
    能优化多少优化多少吧,其实广告这东西用图片或者Flash比较好,怎么用数据库了.
      

  2.   

    总体来说,打开一次首页,30多次数据库查询,是很少的。
    关键看你每次的执行时间,是不是能降到 0.1秒以下。
    用ajax技术显示广告信息,同时降低每次执行时间,是可行的。还一种办法,就是每次查询,不要只查询一条出来,一次查询出来10~30条(根据情况设定),然后记录session。
    把当前广告的条数指针记录在session里面。
    下次进入再要广告的时候。看看指针指向哪里,取下一个就行了,然后指针的条数+1,再记录session,如果大于10~30条(根据情况设定),再取出那么多,就ok了。
    明白我的意思了吗?
      

  3.   

    访问日志这里实时性要求不要的可以用log4j记录到文件,然后写个调度程序在服务器空闲(比如凌晨?)的时候再写入数据库
      

  4.   

    重新写那个语句吧。用 insert  ... values (),...,();