鍍金池/ 問(wèn)答/PHP  Linux  數(shù)據(jù)庫(kù)/ mysql怎樣高效批量更新數(shù)據(jù)?

mysql怎樣高效批量更新數(shù)據(jù)?

UPDATE kt_accbalance 
SET accbalance_ep = CASE user_id 
WHEN 10001 THEN
accbalance_ep + 8 
WHEN 10002 THEN
accbalance_ep + 5 
WHEN 10004 THEN
accbalance_ep + 3 
WHEN 10006 THEN
accbalance_ep + 10 
WHEN 10039 THEN
accbalance_ep + 100 
END 
WHERE
user_id IN ( 10001, 10002, 10004, 10006, 10039 )

這是批量更新5條。如果批量更新2000條,意思就是有2000個(gè)user_id要更新。2000個(gè)這種長(zhǎng)度恐怖啊。mysql能處理這么長(zhǎng)的嗎?2000條,sql語(yǔ)句是現(xiàn)在長(zhǎng)度的400倍。mysql行嗎,允許sql能整這么長(zhǎng)嗎?如果不可以,有沒(méi)有其他替代的高性能方案呢。

參考了這個(gè)文章:參考

回答
編輯回答
嘟尛嘴

mysql默認(rèn)語(yǔ)句最大長(zhǎng)度是1m,2000條問(wèn)題不大。但是你可以選擇用熟悉的語(yǔ)言來(lái)拼sql語(yǔ)句,從文件讀userid,這樣支持更多的userid,效率更高

2018年8月15日 10:34
編輯回答
誮惜顏

用Medoo 批量更新2W條問(wèn)題不大.

2017年3月26日 01:04
編輯回答
墨小羽

問(wèn)題分析:在mysql語(yǔ)句里面,存在一個(gè)case when的條件處理,這個(gè)條件處理直接導(dǎo)致整條sql語(yǔ)句可能因?yàn)殚L(zhǎng)度過(guò)長(zhǎng)而無(wú)法正常運(yùn)行。
解決思路:將case when的條件處理從mysql里面剝離出來(lái),交給php來(lái)處理,比如在一個(gè)循環(huán)里面遍歷所有user_id,每次遍歷都拼接一個(gè)update語(yǔ)句(只針對(duì)單個(gè)用戶),然后在循環(huán)體里面完成mysql_query就行了。

2018年2月3日 16:17