我有一个足球幻想联盟的PHP脚本,有20个团队和超过400名玩家被分配给团队,我有500个用户。
每周都应该给每个玩家分配一个分数,这样最终每个用户都会有一个积分来自他的阵型,这将产生本赛季的排名。
第一周积分正常添加,但在第二周积分时,addpont部分变得如此缓慢,并且在第3周积分出现套接字超时错误。
这是我在向用户添加点时使用的代码:
// Adding Point To the user player list
$sql_user="select * from ".$prev."user LIMIT 0, 100 ";
$re_user=mysql_query($sql_user);
while($d_user=mysql_fetch_array($re_user))
{
$userID=$d_user['id'];
$sql_addpointgroup="select * from ".$prev."addpoint group by weekno order by weekno";
$re_addpointgroup=mysql_query($sql_addpointgroup);
while($d_addpointgroup=mysql_fetch_array($re_addpointgroup))
{
$points=0;
$sql_addpoint="select * from ".$prev."addpoint where weekno='".$d_addpointgroup['weekno']."'";
$re_addpoint=mysql_query($sql_addpoint);
while($d_addpoint=mysql_fetch_array($re_addpoint))
{
$points=$d_addpoint['points'];
$sql_weekstatistic="select * from ".$prev."weekstatistic where weekno='".$d_addpointgroup['weekno']."' and userID='$userID' and playerID='".$d_addpoint['playerID']."'";
$re_weekstatistic=mysql_query($sql_weekstatistic);
if(mysql_num_rows($re_weekstatistic)>0)
{
$sql_update="update ".$prev."weekstatistic set points='$points' where weekno='".$d_addpointgroup['weekno']."' and userID='$userID' and playerID='".$d_addpoint['playerID']."'";
mysql_query($sql_update);
}
}
}
}
我将每次提交的用户数限制为100个,即使代码仍然很慢。
缓慢只有这个代码其他网站部分正常工作。
有没有办法以其他更快的方式编写代码,或者我还能做其他事情吗?
非常感谢,答案 0 :(得分:1)
select * from
我希望您在*
查询中了解SELECT
的含义。
这意味着ALL COLUMNS
。
您不需要每行所有列的值。
在您的查询中具体说明,只选择您需要的列。
例如,此查询:
$sql_weekstatistic="select * from ".$prev."weekstatistic where weekno='".$d_addpointgroup['weekno']."' and userID='$userID' and playerID='".$d_addpoint['playerID']."'";
您已经拥有以下值:
weekno @ $d_addpointgroup['weekno']
userID @$userID
playerID @$d_addpoint['playerID']
基于其他查询。
然而,您仍然使用SELECT * FROM
。
这是关于性能和SQL的小技巧。
BTW,使用mysql_real_escape_tring()
保护您的查询,
或者,甚至更好,按照@lshikawa的建议移至mysqli
或PDO
。
答案 1 :(得分:0)
除了建议您遵循此线程中其他人的建议之外,我不打算提及SQL注入的问题。说真的 - 如果您要求人们提交个人数据以便存储在您的数据库中,您应该保护他们不要让数据被盗。
你的过程缓慢的原因可能是双重的。
首先,当只需要一个查询时,您将使用5个查询。您要求数据库提供大量数据,用于向其提出更多问题 - 在不了解您的架构的情况下,很难为您提供有效的替代方案,但类似于:
update ".$prev."weekstatistic
set points = ap.points
from weekstatistic ws,
addpoint ap,
user u
where weekno = //work out the current weeknumber
and userID = u.userID
and playerID = ap.playerID'
这应该实现相同,但只在一个查询中;那应该快得多。
其次,您可能在表上没有正确的索引 - 这是“我的查询变得越来越慢,因为我在表中获得更多数据”的经典原因。阅读EXPLAIN,并添加一些索引。