UPDATE语句需要太长时间

时间:2014-04-30 11:45:51

标签: php mysql xml

我有这个问题,希望有人可以帮助我:

那么它是什么?

我有一个开发的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系统。

3 个答案:

答案 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