我有这个问题,希望有人可以帮助我:
那么它是什么?
我有一个开发的PHP脚本,可以将XML文件从文件夹导入数据库。
XML文件看起来像这样 - XML file
基本上,脚本将XML文件中的信息存储到5个表中,并且可以正常工作。 但问题是我的文件不包含PLAYER对象中玩家的ID信息,因此在将所有内容导入数据库之后我必须运行此查询:
$sql = "SELECT igraci.ID, utakmice.Player_ID, utakmice.ID AS broj FROM igraci LEFT JOIN utakmice ON (igraci.Team_ID = utakmice.Team_ID) AND (igraci.Surname = utakmice.Lastname) AND (igraci.Name = utakmice.Firstname);";
$tabela = mysql_query($sql);
$row = mysql_fetch_assoc($tabela);
$totalrow = mysql_num_rows($tabela);
$i=0;
do {
$i++;
$sql = "UPDATE utakmice SET Player_ID=" . $row['ID'] . " WHERE ID = " . $row['broj'] . "";
echo $sql."<br>";
mysql_query($sql);
} while ($row = mysql_fetch_assoc($tabela));
Select语句执行得非常快,我没有问题,但UPDATE命令使脚本超时。 我已尝试制作此QUERY索引中使用的字段,但这没有帮助,只要我有超过2200行脚本失败。 该脚本在旧版本的php上执行正常,但上个月我们不得不升级到5.3以及问题开始的地方。 有什么方法可以加快这个更新速度吗?
PS:XML文件来自FIBA live Cms系统。
答案 0 :(得分:0)
在INDEX
上添加utakmice.ID
以加快WHERE
部分。
如果您不确定性能运行:
EXPLAIN SELECT * FROM utakmice WHERE ID = [x]
查看它是使用索引还是进行全表扫描(索引是好的,表扫描很慢)
答案 1 :(得分:0)
除了在ID
上设置索引外,您还可以尝试按照here中的说明批量处理更新。
您需要在必要时通过连接case-whens来准备查询。值得一试,但我还没有进行任何性能测试,看看它是否能给你带来巨大的推动力。
最后你会得到类似的东西:
UPDATE utakmice SET title = CASE
WHEN id = <your_first_broj_from_result> THEN <your_first_id_from_result>
WHEN id = <your_second_broj_from_result> THEN <your_second_id_from_result>
...
END
WHERE id IN (<your_first_broj_from_result>, <your_second_broj_from_result>,...)
答案 2 :(得分:0)
是php脚本超时吗?
您是否需要将此作为SELECT,然后进行大量更新?
你能不能只使用一个UPDATE语句,如下所示: -
UPDATE utakmice
INNER JOIN igraci
ON (igraci.Team_ID = utakmice.Team_ID)
AND (igraci.Surname = utakmice.Lastname)
AND (igraci.Name = utakmice.Firstname)
SET utakmice.Player_ID = igraci.ID