【高分求代码优化】频繁读取数据库,怎么减少数据库访问次数?【菜鸟新作求高手优化】
<?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





