2014-04-30 301 views
1

那麼我有這個問題,我希望有人可以幫助我:UPDATE語句花費太長時間

那麼最新情況呢?

我有一個開發的PHP腳本,可以將XML文件從文件夾導入數據庫。

XML文件看起來像這個 - XML file

基本上腳本存儲從5個表中的XML文件的信息,並正常工作。 但問題是,我的文件不包含玩家在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

您可以用'LIMIT 1'更新詢問,如果你有在表中的'ID'只有一條記錄。將減少一些sql執行時間 –

回答

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 
+0

謝謝你,這個對於整個數據庫在2秒內執行! – iGoogle

0

utakmice.ID上增加一個INDEX以加快WHERE的部分。

如果你不知道性能來看:如果它使用一個索引或設置做了全表掃描(索引是好的,表掃描速度慢)

0

除了

EXPLAIN SELECT * FROM utakmice WHERE ID = [x] 

ID上的索引,您可以嘗試批量更新,如here中所述。

您需要在需要時通過串聯大小寫來準備查詢。這是值得一試的,但我沒有做過任何性能測試,看看它是否會給你帶來巨大的提升。

在你會得到類似的結尾:

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>,...)