CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  PHP

【高分求代码优化】频繁读取数据库,怎么减少数据库访问次数?【菜鸟新作求高手优化】

楼主neverdead(大浪淘沙)2006-11-27 19:33:17 在 Web 开发 / PHP 提问

<?php  
  header("Content-type:   text/xml");  
  echo("<?xml   version='1.0'   encoding='GB2312'?>\n");  
  require_once   ('config/authconfig.php');  
  $connection   =   mysql_connect($dbhost,   $dbusername,   $dbpass);  
  mysql_select_db($dbname,   $connection);  
  mysql_query('SET   NAMES   "gb2312"');  
  $task=$_POST['task'];  
  $clickid=$_POST['id'];  
  ?>  
  <shops>  
  <?  
  if   ($task=='p')   {//返回idx当前数据  
          $result   =   mysql_query("SELECT   *   FROM   idx");  
          while   ($row=mysql_fetch_array($result))   {//这里输出结果  
  ?>  
  <entry>  
      <id><?=$row['type'].'_'.$row['id']?></id>  
      <username><?=$row['username']?></username>  
      <pic><?=$row['pic']?></pic>  
      <shop><?=$row['shop']?></shop>  
  </entry>  
  <?  
          }  
  }   elseif   ($task=='c')   {  
          $result   =   explode("_",   $clickid);  
          $type   =$result[0];  
          $id=$result[1];  
          $result   =   mysql_query("SELECT   counter   FROM   ct   WHERE   type='$type'");  
          $row   =   mysql_fetch_array($result);  
          if   ($row[0]   <   3)   {   //统计值还没有达到3  
                  mysql_query("UPDATE   ct   SET   counter=counter+1   WHERE   type='$type'");  
          }   else   {   //否则,更新idx中的数据  
                  mysql_query("UPDATE   ct   SET   counter=0   WHERE   type='$type'");   //更新计数器  
                  mysql_query("DELETE   FROM   idx   WHERE   id=7   AND   type='$type'");//删除第7个记录  
                  mysql_query("UPDATE   idx   SET   id=id+1   WHERE   type='$type'");     //然后剩下第0~6个记录的id分别加1  
                  $result=mysql_query("SELECT   shops.username,shops.pic,shops.shop   FROM   shops,idx   WHERE   id=1   AND   shops.type='$type'   AND   shops.prev=idx.username");  
                  $row=mysql_fetch_array($result);//取得新数据,并加入到表idx中  
                  $sql="INSERT   INTO   idx   (id,username,pic,shop,type)   VALUES   ('0','".$row[0].'\',\''.$row[1].'\',\''.$row[2]."','$type')";  
                  mysql_query($sql);  
          }  
  }   else   {  
          //错误情况  
  }  
  ?>  
  </shops>  
   
  --------------------什么分界线------------------------  
   
  是不是每次请求这个页面的时候都要进行数据库联接?  
  查询语句太多了,并发执行会不会有大问题?  
  表idx中的数据怎么放在cache或临时文件中,而不是每次都重新读取 问题点数:50、回复次数:25Top

1 楼zeroleonhart(Strong Point:Algorithm)回复于 2006-11-27 21:40:50 得分 10

用   mysql_pconnect()Top

2 楼li1229363()回复于 2006-11-28 12:13:26 得分 3

你可以定义一个全局变量!一次把所有的数据都读出来!省下的只要你删除就可以了啊!那个影响就不大了啊!  
   
  我一般都是一次性读出来所有的数据,放到数组里面操作的。删除当然都是一次次的来了,这个如果你使用的是某一些数据表,可以进行类似于存储过程的东西,那样你就要生好多事了Top

3 楼yueliangdao0608((深圳PHPER.MSN:yueliangdao0608@gmail.com)回复于 2006-11-28 13:04:58 得分 3

mysql_pconnect()Top

4 楼neverdead(大浪淘沙)回复于 2006-11-28 18:38:14 得分 0

那计数器的值能不能不放在数据库中呢?怎么做好点?Top

5 楼neverdead(大浪淘沙)回复于 2006-11-29 13:30:08 得分 0

存储过程?Top

6 楼zhaohua0317(小毛咪咪眼)回复于 2006-11-30 20:53:12 得分 0

路过  
  *******************************************************  
  发布-寻找-分享免费资源请到WORKING8  
  http://www.working8.comTop

7 楼FEB15(张郎)回复于 2006-12-04 18:11:43 得分 3

如果仅仅是查询又必须保持新的数据即时发布,那只能优化查询语句。  
   
  你语句有问题,就算使用存储过程也快不到哪去。     推荐用存储过程Top

8 楼rf123()回复于 2006-12-05 17:01:10 得分 3

不是每次mysql都会查询的,mysql有自己的cache,短时间内频繁查询mysql会自动从cache里读出来的,不过条件比较苛刻,如每次查询的语句必须一样,区分大小写等等  
  你看看手册就知道了Top

9 楼neverdead(大浪淘沙)回复于 2006-12-06 14:42:22 得分 0

mysql_query("UPDATE   ct   SET   counter=0   WHERE   type='$type'");   //更新计数器  
  mysql_query("DELETE   FROM   idx   WHERE   id=7   AND   type='$type'");//删除第7个记录  
  mysql_query("UPDATE   idx   SET   id=id+1   WHERE   type='$type'");   //然后剩下第0~6个记录的id分别加1  
  ======  
  像这种情况,能不能把3条查询和起来,变成一次查询呢?Top

10 楼helloyou0(你好!)回复于 2006-12-07 09:41:52 得分 6

你这个数据又不是太大,没啥大问题.  
   
  减少查询次数要从需求和设计上着手,程序都写到这步了,  
  这些查询合不合的不会有大影响,  
   
  Top

11 楼visam168()回复于 2006-12-07 12:27:44 得分 0

帮顶Top

12 楼neverdead(大浪淘沙)回复于 2006-12-07 12:29:52 得分 0

那怎么做并发控制呢?  
  在idx表中竟然会出现id=8这种情况。。Top

13 楼Meteorlet(http://smartdict.cn)回复于 2006-12-07 13:03:00 得分 0

MySQL   4.1.8   下没有出现这种问题Top

14 楼neverdead(大浪淘沙)回复于 2006-12-08 23:27:58 得分 0

如果只是一个用户访问这个文件是没有问题的阿,但是同时两个人以上在线就出现这个问题了,而且出现id=8这种情况也不止一次了Top

15 楼neverdead(大浪淘沙)回复于 2006-12-08 23:29:38 得分 0

我的服务器的数据库是4.1.21Top

16 楼li1229363()回复于 2006-12-09 09:11:32 得分 3

计数器还是使用全局变量的好~绝对的。你一定要使用全局变量,不然……对数据库的负担太重了Top

17 楼xiao1zhao()回复于 2006-12-09 12:07:59 得分 0

帮顶顶Top

18 楼seakingx(亚龙湾)回复于 2006-12-09 14:47:01 得分 3

如果数据变化很少,   或者是只有后台才会修改数据的情况,  
  我一般是生成XML文件,   效率高很多。Top

19 楼neverdead(大浪淘沙)回复于 2006-12-10 20:14:22 得分 0

re   li1229363()    
  我在php手册上找的关于全局变量和静态变量的例子  
  <?php  
  $a   =   1;  
  $b   =   2;  
   
  function   Sum()  
  {  
          $GLOBALS['b']   =   $GLOBALS['a']   +   $GLOBALS['b'];  
  }  
   
  Sum();  
  echo   $b;  
  ?>    
  这个我每次刷新输出的都是3。。怎么用#Globals变量呢?  
   
  例子   12-6.   使用静态变量的例子  
   
  <?php  
  function   Test()  
  {  
          static   $a   =   0;  
          echo   $a;  
          $a++;  
  }  
  ?>    
  现在,每次调用   Test()   函数都会输出   $a   的值并加一。  
  这个倒是可以,但是对静态变量的解释却有这么一句:“静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。”首先,静态变量只能用在局部函数中!说的是值不丢失,那这个值存在服务器内存里多久呢?  
  re   seakingx(亚龙湾)  
  idx表数据变化很频繁的,本来我是想把表idx中的数据放在cache中的,就比如前面的计数器,但是因为我不会弄,所以我就把这两个值写进数据库了  
   
  感谢所有顶帖的朋友们哦^_^Top

20 楼zhys9(OoP.plorer)回复于 2006-12-14 16:55:32 得分 10

DELETE   FROM   idx   WHERE   id>6   AND   type='$type'  
  这样肯定不会有id=8啦~~~Top

21 楼helloyou0(你好!)回复于 2006-12-15 14:45:39 得分 3

php没有你需要的那种全局变量.  
  只有通过文件或数据库等保存跨页面的计数  
   
  另,   你的这个  
  为什么不把id设成auto_increment,  
  insert后,  
  delete   id   最小的一个,  
  这样insert和delete成对出现,表中必然只有6条.  
   
   
  上面zhys9的也是一个办法.  
   
  Top

22 楼neverdead(大浪淘沙)回复于 2006-12-15 15:05:21 得分 0

re   zhys9(OoP.plorer)  
  在暂时还不知道为什么会出现id=8这种情况下,这个方法用来过渡还是不错滴  
   
  re   helloyou0(你好!)    
  id不唯一的呢,表中用type来区别的,也就是说id和type一起才能确定一条记录Top

23 楼sadking()回复于 2007-01-07 22:49:21 得分 3

可以考虑一下用XMLTop

24 楼neverdead(大浪淘沙)回复于 2007-01-13 11:09:01 得分 0

这个优化看来是好难的哦Top

25 楼liyunfan1992(fan's blog(www.cq100.cn))回复于 2007-02-25 22:18:45 得分 0

用这个缓存类  
  fanCache  
  http://www.cq100.cn/read.php?4  
  然后不经常更新且不需要访问权限的生成HTML!  
  谢谢,给分吧Top

相关问题

关键词

得分解答快速导航

  • 帖主:neverdead
  • zeroleonhart
  • li1229363
  • yueliangdao0608
  • FEB15
  • rf123
  • helloyou0
  • li1229363
  • seakingx
  • zhys9
  • helloyou0
  • sadking

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo