《MYSQL數(shù)據(jù)庫(kù)mysql 批量更新與批量更新多條記錄的不同值實(shí)現(xiàn)方法》要點(diǎn):
本文介紹了MYSQL數(shù)據(jù)庫(kù)mysql 批量更新與批量更新多條記錄的不同值實(shí)現(xiàn)方法,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
批量更新MYSQL應(yīng)用
mysql更新語(yǔ)句很簡(jiǎn)單,更新一條數(shù)據(jù)的某個(gè)字段,一般這樣寫:MYSQL應(yīng)用
如果更新同一字段為同一個(gè)值,mysql也很簡(jiǎn)單,修改下where即可:MYSQL應(yīng)用
這里注意 ‘other_values' 是一個(gè)逗號(hào)(,)分隔的字符串,如:1,2,3MYSQL應(yīng)用
那如果更新多條數(shù)據(jù)為不同的值,可能很多人會(huì)這樣寫:MYSQL應(yīng)用
即是循環(huán)一條一條的更新記錄.一條記錄update一次,這樣性能很差,也很容易造成阻塞.MYSQL應(yīng)用
那么能不能一條sql語(yǔ)句實(shí)現(xiàn)批量更新呢?mysql并沒有提供直接的方法來(lái)實(shí)現(xiàn)批量更新,但是可以用點(diǎn)小技巧來(lái)實(shí)現(xiàn).MYSQL應(yīng)用
這里使用了case when 這個(gè)小技巧來(lái)實(shí)現(xiàn)批量更新.
舉個(gè)例子:MYSQL應(yīng)用
這句sql的意思是,更新display_order 字段,如果id=1 則display_order 的值為3,如果id=2 則 display_order 的值為4,如果id=3 則 display_order 的值為5.
即是將條件語(yǔ)句寫在了一起.
這里的where部分不影響代碼的執(zhí)行,但是會(huì)提高sql執(zhí)行的效率.確保sql語(yǔ)句僅執(zhí)行需要修改的行數(shù),這里只有3條數(shù)據(jù)進(jìn)行更新,而where子句確保只有3行數(shù)據(jù)執(zhí)行.MYSQL應(yīng)用
如果更新多個(gè)值的話,只需要稍加修改:MYSQL應(yīng)用
到這里,已經(jīng)完成一條mysql語(yǔ)句更新多條記錄了.
但是要在業(yè)務(wù)中運(yùn)用,需要結(jié)合服務(wù)端語(yǔ)言,這里以php為例,構(gòu)造這條mysql語(yǔ)句:MYSQL應(yīng)用
這個(gè)例子,有8條記錄進(jìn)行更新.代碼也很容易理解,你學(xué)會(huì)了嗎MYSQL應(yīng)用
性能分析MYSQL應(yīng)用
當(dāng)我使用上萬(wàn)條記錄利用mysql批量更新,發(fā)現(xiàn)使用最原始的批量update發(fā)現(xiàn)性能很差,將網(wǎng)上看到的總結(jié)一下一共有以下三種辦法:MYSQL應(yīng)用
1.批量update,一條記錄update一次,性能很差MYSQL應(yīng)用
2.replace into 或者insert into ...on duplicate key updateMYSQL應(yīng)用
或者使用MYSQL應(yīng)用
3.創(chuàng)建臨時(shí)表,先更新臨時(shí)表,然后從臨時(shí)表中updateMYSQL應(yīng)用
?代碼如下 復(fù)制代碼
create temporary table tmp(id int(4) primary key,dr varchar(50));
insert into tmp values? (0,'gone'), (1,'xx'),...(m,'yy');
update test_tbl, tmp set test_tbl.dr=tmp.dr where test_tbl.id=tmp.id; MYSQL應(yīng)用
注意:這種方法需要用戶有temporary 表的create 權(quán)限.MYSQL應(yīng)用
下面是上述方法update 100000條數(shù)據(jù)的性能測(cè)試結(jié)果:MYSQL應(yīng)用
逐條updateMYSQL應(yīng)用
real??? 0m15.557s
user??? 0m1.684s
sys??? 0m1.372sMYSQL應(yīng)用
replace into
real??? 0m1.394s
user??? 0m0.060s
sys??? 0m0.012sMYSQL應(yīng)用
insert into on duplicate key update
real??? 0m1.474s
user??? 0m0.052s
sys??? 0m0.008sMYSQL應(yīng)用
create temporary table and update:
real??? 0m0.643s
user??? 0m0.064s
sys??? 0m0.004sMYSQL應(yīng)用
就測(cè)試結(jié)果來(lái)看,測(cè)試當(dāng)時(shí)使用replace into性能較好.MYSQL應(yīng)用
replace into? 和insert into on duplicate key update的不同在于:
replace into 操作本質(zhì)是對(duì)重復(fù)的記錄先delete 后insert,如果更新的字段不全會(huì)將缺失的字段置為缺省值
insert into 則是只update重復(fù)記錄,不會(huì)改變其它字段.MYSQL應(yīng)用
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/1597.html