我已經在表1進行修改保存數據該臨時表更新表中的數據,以更新表1我使用查詢:我想通過批量
UPDATE table1 pr
INNER JOIN tmpTable tmp
ON (pr.product_id = tmp.product_id)
SET pr.isactive = tmp.isactive
但由於tmpTable持有大量的數據更新,我的查詢有時會結束到'超時'。所以我的問題是,基本上按批次更新數據的最簡單方法是什麼?比如說10K。
在此先感謝!
我已經在表1進行修改保存數據該臨時表更新表中的數據,以更新表1我使用查詢:我想通過批量
UPDATE table1 pr
INNER JOIN tmpTable tmp
ON (pr.product_id = tmp.product_id)
SET pr.isactive = tmp.isactive
但由於tmpTable持有大量的數據更新,我的查詢有時會結束到'超時'。所以我的問題是,基本上按批次更新數據的最簡單方法是什麼?比如說10K。
在此先感謝!
你在PHP中標記了這個,所以我假設你願意在那裏做一些工作,而不僅僅是在一個查詢中。多次運行查詢。像
for($i<$minId; $i<maxId;$i+=10000){
$db->query("UPDATE table1 pr
INNER JOIN tmpTable tmp
ON (pr.product_id = tmp.product_id)
SET pr.isactive = tmp.isactive where isactive between $i and $i+10000");
}
的東西,如果你正在運行的MyISAM你的風險的事情這樣或那樣你結束了在部分完成的狀態。如果你正在運行innodb並且想維護一個事務的全部或者全部規範,你必須將這個循環包裝在一個開始/提交中。但是,那麼你將會面對潛在的過度大規模交易的影響。
如果你能提供更多關於你的細節的細節,我可以更深入地瞭解這條路線。
使用WHERE子句限制數據 - 如何使用當前提供的信息來格式化無法回答的地方。
您可以通過在臨時表中使用主鍵或標識鍵和UPDATE語句中的WHERE子句來限制記錄數。例如:
UPDATE table1 pr
INNER JOIN tmpTable tmp
ON (pr.product_id = tmp.product_id)
SET pr.isactive = tmp.isactive ***WHERE tmp.ID BETWEEN 1 and 10000***
希望這會有所幫助。
10K似乎不是很多數據。你檢查過你的索引嗎?確保兩個表上的'product_id'是相同的數據類型,具有相同的長度並被索引。這可能有幫助。 – 2012-01-10 04:27:37
嗨艾曼,其實我只是用10K作爲例子,我可以批量更新表格的行數。比方說,更新4M數據10K。 – 2012-01-10 04:40:38